返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >带你快速了解SQL窗口函数
  • 905
分享到

带你快速了解SQL窗口函数

2024-04-02 19:04:59 905人浏览 八月长安
摘要

目录底表分组排序各分组排序函数的差异累计聚合与 GROUP BY 组合使用总结窗口函数形如: 表达式 OVER (PARTITioN BY 分组字段 ORDER BY 排序字段) 有

窗口函数形如:

表达式 OVER (PARTITioN BY 分组字段 ORDER BY 排序字段)

有两个能力:

  • 当表达式为 rank() dense_rank() row_number() 时,拥有分组排序能力。
  • 当表达式为 sum() 等聚合函数时,拥有累计聚合能力。

无论何种能力,窗口函数都不会影响数据行数,而是将计算平摊在每一行。

这两种能力需要区分理解。

底表

以上是示例底表,共有 8 条数据,城市1、城市2 两个城市,下面各有地区1~4,每条数据都有该数据的人口数。

分组排序

如果按照人口排序,ORDER BY people 就行了,但如果我们想在城市内排序怎么办?

此时就要用到窗口函数的分组排序能力:

SELECT *, rank() over (PARTITION BY city ORDER BY people) FROM test

sql 表示在 city 组内按照 people 进行排序。

其实 PARTITION BY 也是可选的,如果我们忽略它:

SELECT *, rank() over (ORDER BY people) FROM test

也是生效的,但该语句与普通 ORDER BY 等价,因此利用窗口函数进行分组排序时,一般都会使用 PARTITION BY。

各分组排序函数的差异

我们将 rank() dense_rank() row_number() 的结果都打印出来:

SELECT *, 
rank() over (PARTITION BY city ORDER BY people),
dense_rank() over (PARTITION BY city ORDER BY people),
row_number() over (PARTITION BY city ORDER BY people)
FROM test

其实从结果就可以猜到,这三个函数在处理排序遇到相同值时,对排名统计逻辑有如下差异:

  • rank(): 值相同时排名相同,但占用排名数字。
  • dense_rank(): 值相同时排名相同,但不占用排名数字,整体排名更加紧凑。
  • row_number(): 无论值是否相同,都强制按照行号展示排名。

上面的例子可以优化一下,因为所有窗口逻辑都是相同的,我们可以利用 WINDOW AS 提取为一个变量:

SELECT *, 
rank() over wd, dense_rank() over wd, row_number() over wd
FROM test
WINDOW wd as (PARTITION BY city ORDER BY people)

累计聚合

我们之前说过,凡事使用了聚合函数,都会让查询变成聚合模式。如果不用 GROUP BY,聚合后返回行数会压缩为一行,即使用了 GROUP BY,返回的行数一般也会大大减少,因为分组聚合了。

然而使用窗口函数的聚合却不会导致返回行数减少,那么这种聚合是怎么计算的呢?我们不如直接看下面的例子:

SELECT *, 
sum(people) over (PARTITION BY city ORDER BY people)
FROM test

可以看到,在每个 city 分组内,按照 people 排序后进行了 累加(相同的值会合并在一起),这就是 BI 工具一般说的 RUNNGIN_SUM 的实现思路,当然一般我们排序规则使用绝对不会重复的日期,所以不会遇到第一个红框中合并计算的问题。

累计函数还有 avg() min() 等等,这些都一样可以作用于窗口函数,其逻辑可以按照下图理解:

你可能有疑问,直接 sum(上一行结果,下一行) 不是更方便吗?为了验证猜想,我们试试 avg() 的结果:

可见,如果直接利用上一行结果的缓存,那么 avg 结果必然是不准确的,所以窗口累计聚合是每行重新计算的。当然也不排除对于 sum、max、min 做额外性能优化的可能性,但 avg 只能每行重头计算。

与 GROUP BY 组合使用

窗口函数是可以与 GROUP BY 组合使用的,遵循的规则是,窗口范围对后面的查询结果生效,所以其实并不关心是否进行了 GROUP BY。我们看下面的例子:

按照地区分组后进行累加聚合,是对 GROUP BY 后的数据行粒度进行的,而不是之前的明细行。

总结

窗口函数在计算组内排序或累计 GVM 等场景非常有用,我们只要牢记两个知识点就行了:

  • 分组排序要结合 PARTITION BY 才有意义。
  • 累计聚合作用于查询结果行粒度,支持所有聚合函数。

讨论地址是:精读《SQL 窗口函数》· Issue #405 · ascoders/weekly

到此这篇关于SQL窗口函数的文章就介绍到这了,更多相关SQL窗口函数内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 带你快速了解SQL窗口函数

本文链接: https://lsjlt.com/news/144249.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 带你快速了解SQL窗口函数
    目录底表分组排序各分组排序函数的差异累计聚合与 GROUP BY 组合使用总结窗口函数形如: 表达式 OVER (PARTITION BY 分组字段 ORDER BY 排序字段) 有...
    99+
    2024-04-02
  • 如何快速了解SQL窗口函数
    这篇文章主要介绍“如何快速了解SQL窗口函数”,在日常操作中,相信很多人在如何快速了解SQL窗口函数问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何快速了解SQL窗口函数”...
    99+
    2024-04-02
  • SQL中的开窗函数(窗口函数)
    目录窗口函数1.1 排序窗口函数rank1.2 rank(), dense_rank(), row_number()区别1.3 排序截取数据lag(),lead(),ntile(),cume_dist()1.4 聚合函数...
    99+
    2024-04-02
  • SQL窗口函数之排名窗口函数的使用
    目录案例分析案例使用的示例表1.环比分析2.同比分析3.复合增长率4.不同产品最高和最低销售额示例表和脚本关于窗口函数的基础,请看文章SQL窗口函数 取值窗口函数可以用于返回窗口内指...
    99+
    2024-04-02
  • SQL窗口函数之取值窗口函数的使用
    目录案例分析1.环比分析2.同比分析3.复合增长率4.不同产品最高和最低销售额示例表和脚本关于窗口函数的基础,请看文章SQL窗口函数 取值窗口函数可以用于返回窗口内指定位置的数据行。...
    99+
    2024-04-02
  • SQL 窗口函数简介
    目录一、什么是窗口函数二、窗口函数的语法2.1 能够作为窗口函数使用的函数三、语法的基本使用方法——使用 RANK 函数四、无需指定 PARTITION BY五、专用窗口函数的种类六、窗口函数的适用范围七、作为窗口函数使用的聚合函数八、计...
    99+
    2014-09-29
    SQL 窗口函数简介
  • SQL窗口函数之排名窗口函数怎么使用
    这篇文章主要介绍“SQL窗口函数之排名窗口函数怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“SQL窗口函数之排名窗口函数怎么使用”文章能帮助大家解决问题。取...
    99+
    2024-04-02
  • 主流的操作系统(带你快速了解)
    目录 一、Windows操作系统 1、详细介绍: Microsoft Windows_百度百科 2、大概介绍 3、windows版本区别 3、windows 优缺点 二、Linux操作系统 1、详细介绍: Linux_百度百科 2、大概介绍...
    99+
    2023-09-04
    windows linux 运维 macos 操作系统
  • 一文带你快速理解JavaScript中call()函数的使用
    目录this指向Call()指向理解call()函数前, 首先要了解一下this的指向问题 this指向 1.指向window: var name = '小红' function ...
    99+
    2023-03-23
    JavaScript call()使用 JavaScript call() JavaScript call
  • 与SQL窗口函数相同
    窗口函数的目的是以声明的方式将业务报告需求转换为SQL,从而使查询性能和开发人员/业务分析师的效率得到显着提高。 我看到现实世界的报告和仪表板在使用窗口功能后从几小时到几分钟,几分钟到几秒钟。 ...
    99+
    2024-04-02
  • 什么是SQL窗口函数
    本篇内容主要讲解“什么是SQL窗口函数”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“什么是SQL窗口函数”吧!窗口函数(Window Function) 是 SQL2003 标准中定义的一项新特...
    99+
    2023-06-15
  • SQL窗口函数是什么
    这篇文章主要介绍了SQL窗口函数是什么,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。窗口函数形如:表达式 OVER (PARTITION BY 分组字段 ORDER BY 排...
    99+
    2023-06-29
  • 带你快速搞定java数组
    目录1、数组的定义2、array 遍历3、List和array 之间的转换1、数组转list2、list 转数组3、Arrays工具类4、可能遇到的问题总结1、数组的定义 ...
    99+
    2024-04-02
  • 一文带你快速理解git
    随着软件开发的快速发展,版本控制也逐渐成为一个重要的话题。Git是目前最受欢迎的版本控制系统之一,它为程序员提供了一种有效的方法来跟踪代码的更改历史记录、协作开发以及管理不同的版本,尽管Git对于初学者可能略显复杂,但只要你按照以下步骤可以...
    99+
    2023-10-22
  • 带你了解C++的数组与函数
    目录数组作为函数的参数数组参数的传递机制数组作为函数的参数 传递首地址。 A进行修改,a同时也会进行修改。 数组参数的传递机制 ...
    99+
    2024-04-02
  • 带你了解C++中的sort函数
    目录sort( ) char型数组char型数组总结sort( ) 使用方法: sort(首元素地址(必填),尾元素地址的下一个地址(必填),比较函数(非必填)) 必须加上头文件...
    99+
    2024-04-02
  • 【MySQL】一文带你了解SQL
    🎬 博客主页:博主链接 🎥 本文由 M malloc 原创,首发于 CSDN🙉 🎄 学习专栏推荐:LeetCode刷题集! ...
    99+
    2023-09-06
    mysql sql 数据库
  • SQL窗口函数怎么使用
    本文小编为大家详细介绍“SQL窗口函数怎么使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“SQL窗口函数怎么使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。什么是窗口函数S...
    99+
    2024-04-02
  • 带你快速了解Java中类和对象的关系
    本文重点解读Java里的类和对象的关系 1、首先介绍两个概念 类:类是对现实生活中一类具有共同属性和行为事务的抽象,确定对象将会拥有的属性和行为。 对象:对象是类的一个实例(对象不...
    99+
    2024-04-02
  • SQL窗口函数之聚合窗口函数的使用(count,max,min,sum)
    目录案例分析1.移动平均值2.累计求和(ROW)3.累计求和(RANGE)示例表和脚本关于窗口函数的基础,请看文章SQL窗口函数 许多常见的聚合函数也可以作为窗口函数使用,包括AVG...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作