SQL窗口函数OVER用法实例整理

吾爱主题 阅读:203 2024-04-01 23:21:45 评论:0

OVER的定义

OVER用于为行定义一个窗口,它对一组值进行操作,不需要使用GROUP BY子句对数据进行分组,能够在同一行中同时返回基础行的列和聚合列。

 

语法

OVER ( [ PARTITION BY column ] [ ORDER BY culumn ] [ROWS|RANGE BETWEEN 边界规则1 and 边界规则2])

PARTITION BY 子句进行分组;

ORDER BY 子句进行排序;

ROWS|RANGE 框架是对窗口进行进一步的分区,框架有两种范围限定方式:一种是使用ROWS子句,通过指定当前行之前或之后的固定数目的行来限制分区中的行数;另一种是RANGE子句,按照排序列的当前值,根据相同值来确定分区中的行数。
窗口函数OVER()指定一组行,开窗函数计算从窗口函数输出的结果集中各行的值。

RANGE表示按照值的范围进行范围的定义,而ROWS表示按照行的范围进行范围的定义;边界规则的可取值见下表

 

用法

OVER开窗函数必须聚合函数或排序函数一起使用,聚合函数一般指SUM(),MAX(),MIN,COUNT(),AVG()等常见函数。排序函数一般指RANK(),ROW_NUMBER(),DENSE_RANK(),NTILE()等。

 

示例

创建测试表

create table Employee
(
    ID INT PRIMARY KEY
    ,Name VARCHAR(20)
    ,GroupName VARCHAR(20)
    ,Salary INT
) INSERT into Employee VALUES(1, "小明", "开发部", 8000), (4, "小张", "开发部", 7600), (5, "小白", "开发部", 7000), (8, "小王", "财务部", 5000), (9, null, "财务部", NULL), (15, "小刘", "财务部", 6000), (16, "小高", "行政部", 4500), (18, "小王", "行政部", 4000), (23, "小李", "行政部", 4500), (29, "小吴", "行政部", 4700)
;

 

SUM后的开窗函数

select  *
        ,SUM(Salary) OVER(PARTITION BY Groupname) 每个组的总工资
        ,SUM(Salary) OVER(PARTITION BY groupname ORDER BY ID) 每个组的累计总工资
        ,SUM(Salary) OVER(ORDER BY ID) 累计工资
        ,SUM(Salary) OVER() 总工资
from    Employee

结果如下:

其中开窗函数的每个含义不同,我们来具体解读一下:

SUM(Salary) OVER (PARTITION BY Groupname)

只对PARTITION BY后面的列Groupname进行分组,分组后求解Salary的和。

SUM(Salary) OVER (PARTITION BY Groupname ORDER BY ID)

对PARTITION BY后面的列Groupname进行分组,然后按ORDER BY 后的ID进行排序,然后在组内对Salary进行累加处理。

SUM(Salary) OVER (ORDER BY ID)

只对ORDER BY 后的ID内容进行排序,对排完序后的Salary进行累加处理。

SUM(Salary) OVER ()

对Salary进行汇总处理

 

排序

ROW_NUMBER()

定义:ROW_NUMBER()函数作用就是将SELECT查询到的数据进行排序,每一条数据加一个序号

select  *
        ,ROW_NUMBER() OVER (PARTITION BY ClassName ORDER BY SCORE DESC) 班内排序
        ,ROW_NUMBER() OVER (ORDER BY SCORE DESC) AS 总排序
from    Scores
;

RANK()

select  ROW_NUMBER() OVER (ORDER BY SCORE DESC) AS [RANK]
        ,*
from    Scores
;

select  RANK() OVER (ORDER BY SCORE DESC) AS [RANK]
        ,*
from    Scores
;

NTILE()

定义:NTILE(N)函数是将数据分成N块,然后再添加1~N的序号。

select  *
        ,NTILE(1) OVER (ORDER BY SCORE DESC) AS 分区后排序
from    Scores
;
select  *
        ,NTILE(2) OVER (ORDER BY SCORE DESC) AS 分区后排序
from    Scores
;
select  *
        ,NTILE(3) OVER (ORDER BY SCORE DESC) AS 分区后排序
from    Scores
;

 

ROWS|RANGE

select  *
        ,SUM(Salary) OVER(PARTITION BY groupname ORDER BY ID ROWS between CURRENT ROW and 5 FOLLOWING) 从当前行开始后5行的和
from    Employee

 

参考

https://www.modb.pro/db/42912

 

总结

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

原文地址:https://blog.csdn.net/m0_37953759/article/details/123076115

可以去百度分享获取分享代码输入这里。
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

【腾讯云】云服务器产品特惠热卖中
搜索
标签列表
    关注我们

    了解等多精彩内容