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

 更新时间:2022年08月26日 11:18:47   作者:BeKnown  
做SQL题时碰到了over()函数不太理解,所以整理了下,下面这篇文章主要给大家介绍了关于SQL窗口函数OVER用法的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下

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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 解决Java程序使用MySQL时返回参数为乱码的示例教程

    解决Java程序使用MySQL时返回参数为乱码的示例教程

    这篇文章主要介绍了解决Java程序使用MySQL返回参数为乱码的问题的教程,通过示例来讲解utf-8编码在MySQL中的相关配置,示例需要的朋友可以参考下
    2015-12-12
  • MySQL数据库之约束简析

    MySQL数据库之约束简析

    这篇文章主要介绍了MySQL数据库之约束简析,约束是作用于表中字段上的规则,用于限制存储在表中的数据,保证数据库中数据的正确、有效性和完整性,需要的朋友可以参考下
    2023-09-09
  • MySQL与存储过程的相关资料

    MySQL与存储过程的相关资料

    这篇文章主要介绍了MySQL与存储过程的相关资料,需要的朋友可以参考下
    2007-03-03
  • jdbc连接mysq之serverTimezone设定方式

    jdbc连接mysq之serverTimezone设定方式

    这篇文章主要介绍了jdbc连接mysq之serverTimezone设定方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • MySQL 两种恢复数据的方法

    MySQL 两种恢复数据的方法

    这篇文章主要介绍了MySQL 两种恢复数据的方法,帮助恢复线上数据,保证数据完整,感兴趣的朋友可以了解下
    2020-10-10
  • Linux下MYSQL 5.7 找回root密码的问题(亲测可用)

    Linux下MYSQL 5.7 找回root密码的问题(亲测可用)

    这篇文章主要介绍了Linux下MYSQL 5.7 找回root密码的问题(亲测可用),通过 --skip-grant-tables 找回,新增完成后,:wq 保存退出,重启mysqld服务,具体内容详情跟随小编一起看看吧
    2021-10-10
  • MySQL8.0.27安装过程中卡在Initializing Database中并报错的解决

    MySQL8.0.27安装过程中卡在Initializing Database中并报错的解决

    本文主要介绍了MySQL8.0.27安装过程中卡在Initializing Database中并报错的解决,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • mysql锁表确认及解除锁表的实现示例

    mysql锁表确认及解除锁表的实现示例

    使用MySQL数据库时,我们可能会遇到数据库表被锁定的情况,本文主要介绍了mysql锁表确认及解除锁表的实现示例, 具有一定的参考价值,感兴趣的可以了解一下
    2024-06-06
  • Mysql索引分类及其使用实例详解

    Mysql索引分类及其使用实例详解

    数据库的索引就像一本书的目录,能够加快数据库的查询速度,MYSQL索引有四种PRIMARY、INDEX、UNIQUE、FULLTEXT, 其中PRIMARY、INDEX、UNIQUE是一类,FULLTEXT是一类,本文给大家介绍Mysql索引分类及其使用实例,感兴趣的朋友一起看看吧
    2022-07-07
  • MySQL笔记之修改数据的解决方法

    MySQL笔记之修改数据的解决方法

    本篇文章介绍了,在mysql中修改数据的解决方法。需要的朋友参考下
    2013-05-05

最新评论