SQL函数 - 开窗(窗口)函数

SQL中的开窗函数 OVER的定义 OVER用于为行定义一个窗口,它对一组值进行操作,不需要使用GROUP BY子句对数据进行分组,能够在同一行中同时返回基础行的列和聚合列。 OVER的语法 OVER ([ PARTITION BYcolumn ][ ORDER BY culumn ]) PARTITION BY 子句进行分组; ORDER BY 子句进行排序。 窗口函数OVER()指定一组行,开窗函数计算从窗口函数输出的结果集中各行的值。 开窗函数不需要使用GROUP BY就可以对数据进行分组,... 阅读详情
AI摘要

文章介绍了SQL中的开窗函数,包括排序函数如row_number(),rank(),dense_rank(),ntile()以及聚合函数如sum(),count(),min(),max(),avg()。这些函数在不使用GROUPBY的情况下对数据进行分组和计算,提供了在同一行中展示原始值和聚合值的能力。此外,还提到了lag()和lead()用于移位操作,first_value()和last_value()获取分组内的首尾值,以及ratio_to_report()的百分比分析。文章还讨论了窗口框架的概念,如range和rowsbetween,以及它们如何影响计算范围。最后,列举了开窗函数的应用场景,如求分组内的最高值、累计计算和相邻值比较。

什么是开窗函数?

开窗函数对一组值进行操作,它不像普通聚合函数那样需要使用GROUP BY子句对数据进行分组,能够在同一行中同时返回基础行的列和聚合列

开窗函数的语法形式为:函数 + over(partition by <分组用列> order by <排序用列>),表示对数据集按照分组用列进行分区,并且并且对每个分区按照函数聚合计算,最终将计算结果按照排序用列排序后返回到该行。括号中的两个关键词partition by 和order by 可以只出现一个。

注意:开窗函数不会互相干扰,因此在同一个查询语句中可以同时使用多个开窗函数

开窗函数适用于 mysql 8.0以上版本, sql sever 、hive、oracle 等

开窗函数分类

窗口函数大致分为以下几类:

一、排序开窗函数

① row_number() -- 相同值排名顺延,返回结果1、2、3、4

② rank() -- 相同结果排名相同,后续排名不连续,返回结果为 1、2、2、4

③ dense_rank() -- 相同结果排名相同,后续排名顺延,返回结果为 1、2、2、3

④ ntile(n) -- 分组排名,将数据分为n组并返回对应组号1、2......n

具体例子如下:

select grades
,subjects
,results
,row_number() over(partition by grades,subjects order by results desc) as row_numbers
,rank() over(partition by grades,subjects order by results desc) as ranks
,dense_rank() over(partition by grades,subjects order by results desc) as dense_ranks
,ntile(3) over(partition by grades,subjects order by results desc) as ntiles
from test11

表示将数据集按照grades、subjects字段进行分组后,根据对应排序函数并按照results字段降序返回排名,具体结果如下

二、聚合开窗函数

① sum() -- 分组求和

② count() -- 分组求总数

③ min() -- 分组求最小值

④ max() -- 分组求最大值

⑤ avg() --分组求均值

具体例子如下:

select grades
,subjects
,results
,sum(results) over(partition by grades,subjects order by results desc) as sum聚合1
,sum(results) over(partition by grades,subjects) as sum聚合2
,count(results) over(partition by grades,subjects order by results desc) as count聚合1
,count(results) over(partition by grades,subjects) as count聚合2
,min(results) over(partition by grades,subjects order by results desc) as min聚合1
,min(results) over(partition by grades,subjects) as min聚合2
,max(results) over(partition by grades,subjects order by results desc) as max聚合1
,max(results) over(partition by grades,subjects) as max聚合2
,avg(results) over(partition by grades,subjects order by results desc) as avg聚合1
,avg(results) over(partition by grades,subjects) as avg聚合2
from test11

聚合1表示将数据集按照grades、subjects进行分组后,按照results降序排序,将每组中的results依次聚合;

聚合2表示将数据集按照grades、subjects进行分组后,将每组中的results整体聚合。因此 count(results) over(partition by grades,subjects order by results desc) 与 row_number() over(partition by grades,subjects order by results desc) 可以达到同样目的

深挖两者的差异,主要是 order by 默认统计范围是 rows between unbounded preceding and current row,也就是取当前行数据与当前行之前的数据运算。如果在聚合1 order by 条件的后面加上语句:rows between unbounded preceding and unbounded following,也就可以对分组中的所有数据进行运算,可以得到聚合1相同结果。如下

select grades
,subjects
,results
,sum(results) over(partition by grades,subjects order by results desc rows between unbounded preceding and unbounded following) as sum聚合1
,sum(results) over(partition by grades,subjects) as sum聚合2
,count(results) over(partition by grades,subjects order by results desc rows between unbounded preceding and unbounded following) as count聚合1
,count(results) over(partition by grades,subjects) as count聚合2
,min(results) over(partition by grades,subjects order by results desc rows between unbounded preceding and unbounded following) as min聚合1
,min(results) over(partition by grades,subjects) as min聚合2
,max(results) over(partition by grades,subjects order by results desc rows between unbounded preceding and unbounded following) as max聚合1
,max(results) over(partition by grades,subjects) as max聚合2
,avg(results) over(partition by grades,subjects order by results desc rows between unbounded preceding and unbounded following) as avg聚合1
,avg(results) over(partition by grades,subjects) as avg聚合2
from test11

关于这一部分下文详细描述

三、其他开窗函数

① lag(字段名,n,0) -- 移位开窗函数,表示返回向上第n行指定字段对应数据。其中n代表向上偏移n行,0代表若偏移行数超出表范围则返回0也可以改成其他值,若不写则默认null

② lead(字段名,n,0) -- 移位开窗函数,与lag()相反,表示返回向下第n行指定字段对应数据

③ first_value() -- 取分组内排序后,截止到当前行,第一个值

④ last_value() -- 取分组内排序后,截止到当前行,最后一个值

具体例子如下:

#加order by
select grades
,subjects
,results
,lag(results,1,0) over(partition by grades,subjects order by results desc) as lag移位1
,lead(results,1,0) over(partition by grades,subjects order by results desc) as lead移位1
,first_value(results) over(partition by grades,subjects order by results desc) as first_value排序1
,last_value(results) over(partition by grades,subjects order by results desc) as last_value排序1
from test11

加 order by 代表将数据集按照grades、subjects进行分组后,再根据results降序排序,然后根据函数取当前行数据与当前行之前的数据运算。若不加 order by 则是对分组后的数据直接运算

 #不加order by 
select grades
,subjects
,results
,lag(results,1,0) over(partition by grades,subjects) as lag移位2
,lead(results,1,0) over(partition by grades,subjects) as lead移位2
,first_value(results) over(partition by grades,subjects) as first_value排序2
,last_value(results) over(partition by grades,subjects) as last_value排序2
from test11

不加 order by

⑤ ratio_to_report(字段名) over(partition by 字段名) -- 百分比分析函数,rratio_to_report(字段名) 为分子,over(partition by 字段名) 为分母,若分母中partition by 字段名 省略则表示占数据集整体百分比。为Oracle数据库函数,mysql不能使用

具体例子如下:

select grades
,subjects
,results
,ratio_to_report(results) over()  百分比函数1
,ratio_to_report(results) over(partition by grades,subjects) 百分比函数2
from test11

开窗函数的定位框架

窗口函数除了经常使用的 partition by <分组用列> order by <排序用列> 外,在order by 后存在可省略的窗口框架 range/rows between x and y ,主要用于对partition by的分组结果做进一步限制,并定位出限制后的运算范围。

其中range表示按照值的范围进行范围的定义,而rows表示按照行的范围进行范围的定义。若order by 后未指定框架,那么默认框架将采用 range unbounded preceding and current row,表示从开窗后的第一行到当前行。

若窗口函数没有order by,也就不存在框架range/rows between x and y。

框架range/rows between x and y 具体x、y可取值见下表:

可取值含义
unbounded precedingpartition by 分组order by后 第一行
unbounded followingpartition by 分组order by后 最后一行
current rowpartition by 分组order by后 当前行
n precedingpartition by 分组order by后 前n行
n followingpartition by 分组order by后 后n行

说明:rows between 5 preceding and current row 可缩写为 rows 5 preceding

range 只支持使用 unbounded preceding、 unbounded following、current row

具体例子如下:

select grades
,subjects
,results
,sum(results) over(partition by grades,subjects order by results desc rows between unbounded preceding and current row) as 定位窗口求和1
,sum(results) over(partition by grades,subjects order by results desc range between unbounded preceding and current row) as 定位窗口求和2
from test11

由结果可见,定位窗口求和1 中rows 按照固定行定义,此处表示返回从当前行到分组后第一行之和

定位窗口求和2 中range 按照值进行范围定义,此处仍表示返回从当前行到分组后第一行之和,不过由于当前行存在2个相同order by值(如上图黄框中89),则会先对这两行汇总后再向分组后第一行求和。

开窗函数使用场景

开窗函数应用比较多的场景,以下简单列举:

① 求某个分组下的最大/最小值/TOPn值对应信息,如年级中每个班级的第一名,大区中销售额最高城市,此处用排序函数row_number(),需用order by 排序

②对某个分组求和/个数/均值,如城市历史截至昨天累积销售额/营业天数/平均销售额,此处用sum()/count()/avg(),需用order by 默认的定位框架

③相邻时间求时间差,如用户复购时间周期,此处用lag(),需用order by 排序

窗口函数的定义、分类及用法 开窗函数的使用 定义: 开窗函数也叫分析函数,有两类:一类是聚合开窗函 数,一类是排序开窗函数。 格式:函数名(列) OVER(partition by 列名 order by列名) 使用:一般和 聚合函数使用,组成开窗函数, 常用聚合函数: count()求个数 sum() 求和 avg()求平均数 bai min()最小值 max()最大值 这些函数常与group by子句连用。除了 COUNT 以外,聚合函数忽略空值。 2 .OVER 关键字: OVER 关键字表示把函 阅读详情

相关推荐

【MySQL窗口函数】— 4种窗口函数详解(非聚合窗口函数、聚合窗口函数、命名窗口函数、动态窗口函数)

非聚合函数有以下函数(注:我只列举了常用的。看不明白没关系,我下面会一一对这些进行讲解。

摇光是颗星 2325

SQL知识点(一):SQL中的开窗函数

SQL中的开创函数(附牛客SQL23题【 对所有员工的薪水按照salary降序进行1-N的排名 】)

我是老伯的博客 1万+

SQL函数 - 开窗(窗口)函数

开窗函数表示对数据集按照分组用列进行分区,并且对每一个分区按照函数聚合计算,最终将结果计算按照排序用列排序后返回改行。括号中的两个关键词 partition by 和 order by 可以只出现一个。注意:① 开窗函数不会互相干扰,因此在同一查询语句中可以同时使用多个开窗函数。② 开窗函数适用于 mysql 8.0 以上版本,sql server 、 hive、oracle等。

七七四十九的博客 1976

这应该是最全的总结了!SQL中的开窗函数汇总!

MySQL从8.0版本开始支持窗口函数了,窗口函数又名开窗函数,属于分析函数的一种。用于解决复杂报表统计需求的功能强大的函数。窗口函数用于计算基于组(GROUP BY)的某种聚合值,它和聚合函数的不同之处是:窗口函数可以在分组之后的返回多行结果,而聚合函数对于每个组只返回一行。开窗函数指定了分析函数工作的数据窗口大小,这个数据窗口大小可能会随着行的变化而变化。窗口函数经常会在leetCode的题目中使用到窗口函数的格式函数(Function)的类型不是所有的函数(Function)都支持开窗函数。

Python数据挖掘 5414

SQL开窗函数

数据分析必备函数:开窗函数提供了在查询结果中进行排序、排名、聚合和分析的灵活性,在数据分析和报表生成中非常有用,可以实现更复杂的计算和分析需求。

zwldn的博客 2043

Kylin-Desktop-V10-SP1海光版虚拟机安装全流程(含桥接网络配置)

本文详细介绍了在VMware虚拟机中安装Kylin-Desktop-V10-SP1海光版操作系统的完整流程,重点解决了基于海光(Hygon C86)平台的网络配置难题。内容涵盖从镜像准备、虚拟机创建、系统安装到桥接网络配置的三种实战方法,并提供了安装后的优化与必备软件配置指南,帮助用户高效搭建国产化测试与开发环境。

weixin_29323493的博客 352

SQL开窗函数(窗口函数)详解

一、什么是开窗函数 开窗函数/分析函数:over() 开窗函数也叫分析函数,有两类:一类是聚合开窗函数,一类是排序开窗函数。 开窗函数的调用格式为: 函数名(列名) OVER(partition by 列名 order by列名) 。 如果你没听说过开窗函数,看到上面开窗函数的调用方法,你可能还会有些疑惑。但只要你了解聚合函数,那么理解开窗函数就非常容易了。 我们知道聚合函数对一组值执行计算并返回单一的值,如sum(),count(),max(),min(), avg()等,这些函数常与grou

流水随清风的博客 9万+

L2-011 玩转二叉树

L2-011玩转二叉树(25分) 给定一棵二叉树的中序遍历和前序遍历,请你先将树做个镜面反转,再输出反转后的层序遍历的序列。所谓镜面反转,是指将所有非叶结点的左右孩子对换。这里假设键值都是互不相等的正整数。 输入格式: 输入第一行给出一个正整数N(≤30),是二叉树中结点的个数。第二行给出其中序遍历序列。第三行给出其前序遍历序列。数字间以空格分隔。 输出格式: ...

Beworth1207的博客 1733

SQL - 开窗(窗口)函数

开窗函数对一组值进行操作,它不像普通聚合函数那样需要使用GROUP BY子句对数据进行分组,能够在同一行中同时返回基础行的列和聚合列开窗函数的语法形式为:函数 + over(partition by order by ),表示对数据集按照分组用列进行分区,并且并且对每个分区按照函数聚合计算,最终将计算结果按照排序用列排序后返回到该行。括号中的两个关键词partition by 和order by 可以只出现一个。

eli的博客 4747

【深度学习】基于BERT模型的情感分析(附实战完整代码+数据集)

情感分类是一个快速发展的研究领域,尽管众多模型和数据集在二分类任务中显示出很高的准确性,但细粒度的情感分类任务仍然是一个很大改进空间的领域。分析SST-5数据集,Munikar等人的先前工作表明,嵌入工具BERT允许使用简单的模型来实现最新的准确性。

aaaa_hsjsueu的博客 2万+

华为HCIP-001:PPPOE配置模拟实验

华为HCIP01:PPPOE配置模拟实验 实验环境 pppoe-client上面的接口信息 [AR1]dis ip interface brief *down: administratively down ^down: standby (l): loopback (s): spoofing The number of interface that is UP in Physical is 2 The number of interface that is DOWN in Physical is 1 Th

兔子乖乖 1798

进行查看sql中OVER开窗口函数--的详细使用

1.进行查看sql中OVER开窗口函数 over开窗口函数

奔跑入坑大数据 605

告别龟速!实测Copernicus Dataspace下载Sentinel-2数据的3个提速技巧(附Workspace批量操作)

本文分享了在Copernicus Dataspace平台高效下载Sentinel-2遥感数据的3个实用技巧,包括网络传输层优化、浏览器与API调优以及Workspace批量操作。通过这些方法,用户可将下载速度提升300%以上,特别适合科研人员和团队处理大规模数据需求。

weixin_30706691的博客 178

SQL:开窗函数(窗口函数)

4、 窗口函数 目录4、 窗口函数4.1 排序窗口函数rank4.2 rank(), dense_rank(), row_number()区别4.3 、排序截取数据lag(),lead(),ntile(),cume_dist()4.4 聚合函数作为窗口函数4.4、over(- - rows between and ) 简单理解,就是对查询的结果多出一列,这一列可以是聚合值,也可以是排序值。 开窗函数一般就是说的是over()函数,其窗口是由一个 OVER 子句 定义的多行记录 开窗函数一般分为两类,

忄凝^的博客 1万+

智能车‘大脑’的诞生:揭秘电磁循迹代码背后的控制论与系统思维

本文深入探讨智能车电磁循迹系统的核心架构与控制原理,揭示了其作为精密闭环系统如何通过模块化设计、信号处理、PID控制算法及电机驱动实现自主导航。重点分析了电磁信号采集与处理流程框架,为开发者提供从理论到实践的全面指南。

arduino9maker的博客 531

仿真学习系列(二):ADS仿真直观理解方波与频谱分量的关系

在高速电路设计中,我们常常听到一句话:“信号其实不是电压在传输,而是频率在传播。” 这句话看似抽象,却揭示了信号世界的核心本质——任何时域波形,都可以被拆解为一系列不同频率的正弦波。 那么,一个看似简单的方波,究竟由哪些频率成分组成?为什么在示波器上,有的方波上升沿又快又“方”,而有的却“圆润”得多?这些差异背后,隐藏的正是高频分量的力量。 本文将通过使用 Keysight ADS,从零搭建仿真电路,直观地观察方波与其谐波成分之间的关系。

案例文章,高速信号 813

rank 开窗函数_SQL 窗口函数 OVER 详细用法,一学就会

关注上方“Python数据科学”,选择星标,关键时间,第一时间送达!OVER的定义OVER用于为行定义一个窗口,它对一组值进行操作,不需要使用GROUP BY子句对数据进行分组,能够在同一行中同时返回基础行的列和聚合列。OVER的语法OVER ([ PARTITION BYcolumn ][ ORDER BY culumn ])PARTITION BY 子句进行分组;ORDER ...

weixin_35799770的博客 1547

信捷PLC XD5系列运动控制(10轴)编程应用篇

项目PLC采用XD5-60T10-E,36DI 24DO 晶体管输出,支持10路脉冲输出功能。TMR指令定时器时基可以自己设定,这点比其他品牌PLC方便。ZRN指令我们需要上升沿指令触发。 5、变址寻址 该说不说这个变址寻址是真的强,比西门子指针、三菱的变址寄存器Z 、V都要更加灵活。 7、特殊寄存器:时钟 8、如何建立PLC通讯...............

RXXW_Dor的博客 1万+

【SQL】窗口函数/开窗函数

窗口指一个字段的数据范围, 原则上只能写在SELECT子句中。 同时具有分组和排序功能,不减少原表的行数(group by 可能减少原表行数,而partition by 不会)。 HQL distribute by & cluster by & order by distribute by 会把相同的值分配到同一个reduce里; cluster by其实就是distr...

希希的博客 1583

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

SQL开窗函数精讲:聚合函数+OVER用法、窗口边界与避坑指南

在数据分析和报表开发中,SQL查询常面临一个核心矛盾:既要保留明细行,又要获得分组汇总、累计值或移动平均等统计结果。传统GROUP BY会折叠行数,使明细与汇总难以兼得。窗口函数(Window Function)恰好解决了这一痛点,它允许在原始行基础上,通过OVER子句定义动态窗口范围,让聚合函数在指定分组内计算并附加结果。掌握聚合函数与OVER的组合用法,如SUM、COUNT、AVG结合PARTITION BY和ORDER BY,可以高效实现区域TopN、累计销售额、占比分析等常见业务需求,同时避开RAN

weixin_31155097的博客 47

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

关于计算每天月累计的SQL语句的写法---开窗函数(窗口函数)的应用

关于计算当年每个月年累计的SQL语句的写法 例如有一个表的值为 month value 202001 6 202002 10 202003 9 202004 11 我想获得的结果为 month value 202001 6 202002 16 202003 25 202004 36 select TMP1.month,sum(TMP2.VALUES) from TKDW.TABLE1 TMP1, TKDW.TABLE1 TMP2 where TMP1.month>=TMP2.month--计算当

qq_32389231的博客 5792

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

SQL窗口函数:排名、占比、累计与GROUP BY后再开窗及慢SQL优化

SQL窗口函数(开窗函数)是在不折叠明细行的前提下,对分组内数据进行排序、累计、排名和偏移取值的一类分析函数。其核心原理由OVER子句中的PARTITION BY、ORDER BY与窗口框架共同决定:PARTITION BY定义分组边界,ORDER BY控制累计方向和排名顺序,框架限定参与计算的行范围。相比GROUP BY把多行聚合为一行,窗口函数让明细与分组统计并存,因此适合报表看板、BI分析和后端指标计算中的占比、环比、累计、Top N与SQL去重取最新等场景。理解默认框架、LAST_VALUE边界、N

weixin_29611239的博客 230

【SQL】MySQL中的窗口函数(开窗函数)

partition by是分区,类似于group by,如去掉相当于对所有数据进行计算。窗口函数 over (partition by …order by …多行变一行,常见的sum,count,max,min。行数不变,常见的row_number,rank。order by排序。

想当运维的程序猿 1132

rank 开窗函数_SQL高级功能——窗口函数的使用

· 定义:窗口函数,又叫OLAP(Online Anallytical Processing)函数,可对数据库数据进行实时分析处理。· 功能:同时分组和排序;不减少原表的行数(区别于聚合函数,每行数据都生成一个结果)· 使用场景:排名问题,topN问题· 基本语法:<窗口函数> OVER (PARTITION BY <用于分组的列名> ORDER BY <用于排序的列...

weixin_29494379的博客 1050

SQL开窗函数总结

分析函数中,窗口函数内的ROWS条件

now 2482

HIVE--hive的窗口函数(开窗函数,分析函数)

本文详细介绍了hive窗口函数,即包括开窗函数和分析函数两部分。

数据科学 爱好分享 快乐就完了 1万+
上一篇: Presto 原理 & 调优 & 面试 & 实战全面升级版
下一篇: Hive 系列(一)—— Hive 简介及核心概念
wrr-cat
博客等级 码龄9年 128粉丝 302原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值