SQL中的开窗函数是什么

OVER的定义

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

OVER的语法

OVER ( [ PARTITION BY column ] [ ORDER BY culumn ] )

PARTITION BY 子句进行分组;

ORDER BY 子句进行排序。

窗口函数OVER()指定一组行,开窗函数计算从窗口函数输出的结果集中各行的值。

开窗函数不需要使用GROUP BY就可以对数据进行分组,还可以同时返回基础行的列和聚合列。

OVER的用法

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

OVER在聚合函数中使用的示例

我们以SUM和COUNT函数作为示例来给大家演示。

--建立测试表和测试数据CREATE TABLE Employee(ID INT  PRIMARY KEY,Name VARCHAR(20),GroupName VARCHAR(20),Salary INT)INSERT INTO  EmployeeVALUES(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

(提示:可以左右滑动代码)

结果如下:

SQL中的开窗函数是什么

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

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进行汇总处理

COUNT后的开窗函数

SELECT *,       COUNT(*) OVER(PARTITION BY Groupname ) 每个组的个数,       COUNT(*) OVER(PARTITION BY Groupname ORDER BY ID) 每个组的累积个数,       COUNT(*) OVER(ORDER BY ID) 累积个数 ,       COUNT(*) OVER() 总个数from Employee

返回的结果如下图:

SQL中的开窗函数是什么

后面的每个开窗函数就不再一一解读了,可以对照上面SUM后的开窗函数进行一一对照。

OVER在排序函数中使用的示例

我们对4个排序函数一一演示

--先建立测试表和测试数据WITH t AS(SELECT 1 StuID,'一班' ClassName,70 ScoreUNION ALLSELECT 2,'一班',85UNION ALLSELECT 3,'一班',85UNION ALLSELECT 4,'二班',80UNION ALLSELECT 5,'二班',74UNION ALLSELECT 6,'二班',80)SELECT * INTO Scores FROM t;SELECT * FROM Scores

ROW_NUMBER()

定义:ROW_NUMBER()函数作用就是将SELECT查询到的数据进行排序,每一条数据加一个序号,他不能用做于学生成绩的排名,一般多用于分页查询,比如查询前10个 查询10-100个学生。ROW_NUMBER()必须与ORDER BY一起使用,否则会报错。

对学生成绩排序

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

结果如下:

SQL中的开窗函数是什么

这里的PARTITION BY和ORDER BY的作用与我们在上面看到的聚合函数的作用一样,都是用来进行分组和排序使用的。

此外ROW_NUMBER()函数还可以取指定顺序的数据。

SELECT * FROM (SELECT *, ROW_NUMBER() OVER (ORDER BY SCORE DESC) AS 总排序FROM Scores) t WHERE t.总排序=2;

结果如下:

SQL中的开窗函数是什么

RANK()

定义:RANK()函数,顾名思义排名函数,可以对某一个字段进行排名,这里和ROW_NUMBER()有什么不一样呢?ROW_NUMBER()是排序,当存在相同成绩的学生时,ROW_NUMBER()会依次进行排序,他们序号不相同,而Rank()则不一样。如果出现相同的,他们的排名是一样的。下面看例子:

示例

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

结果:

SQL中的开窗函数是什么

SQL中的开窗函数是什么

其中上图是ROW_NUMBER()的结果,下图是RANK()的结果。当出现两个学生成绩相同是里面出现变化。RANK()是1-1-3-3-5-6,而ROW_NUMBER()则还是1-2-3-4-5-6,这就是RANK()和ROW_NUMBER()的区别了。

DENSE_RANK()

定义:DENSE_RANK()函数也是排名函数,和RANK()功能相似,也是对字段进行排名,那它和RANK()到底有什么不同那?特别是对于有成绩相同的情况,DENSE_RANK()排名是连续的,RANK()是跳跃的排名,一般情况下用的排名函数就是RANK() 我们看例子:

示例

SELECT RANK() OVER (ORDER BY SCORE DESC) AS [RANK],*FROM Scores; SELECT DENSE_RANK() OVER (ORDER BY SCORE DESC) AS [RANK],*FROM Scores;

结果如下:

SQL中的开窗函数是什么

SQL中的开窗函数是什么

上面是RANK()的结果,下面是DENSE_RANK()的结果

NTILE()

定义:NTILE()函数是将有序分区中的行分发到指定数目的组中,各个组有编号,编号从1开始,就像我们说的’分区’一样 ,分为几个区,一个区会有多少个。

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;

结果如下:

SQL中的开窗函数是什么

SQL中的开窗函数是什么

SQL中的开窗函数是什么

就是将查询出来的记录根据NTILE函数里的参数进行平分分区。

到此,相信大家对“SQL中的开窗函数是什么”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

文章标题:SQL中的开窗函数是什么,发布者:亿速云,转载请注明出处:https://worktile.com/kb/p/22500

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
亿速云的头像亿速云认证作者
上一篇 2022年9月2日 下午10:01
下一篇 2022年9月2日 下午10:02

相关推荐

  • Apache Shiro 1.2.4反序列化漏洞实例分析

    0x00 Apache Shiro 这个组件的漏洞很久之前就爆出来了,但是最近工作中又遇到了,刚好最近也在看Java反序列化的东西,所以决定拿出来再分析一下,期间也遇到了一些奇怪的问题。 网上的分析文章中大部分都是手动添加了commons-collections4-4.0的依赖,目的是为了使用yso…

    2022年9月16日
    57600
  • 如何借助CSS 更好的控制定时器

    平时工作中很多场合都要用到定时器,比如延迟加载、定时查询等等,但定时器的控制有时候会有些许麻烦,比如鼠标移入停止、移出再重新开始。这次介绍几个借助 CSS 来更好的控制定时器的方法,一起了解一下吧,相信可以带来不一样的体验。 一、hover 延时触发 有这样一个场景,在鼠标停留在一个元素上1s后才触…

    2022年9月16日
    64700
  • 如何进行Linux恶意软件SkidMap分析

    挖掘加密货币恶意软件仍然是一个普遍的威胁。网络罪犯也越来越多地探索新的平台和方法来进一步利用挖矿恶意软件——从移动设备、Unix和类Unix系统到服务器和云环境。 攻击者不断提升恶意软件抵御检测的能力。例如,将恶意软件与看门狗组件捆绑在一起,以确保非法的加密货币挖掘活动在受感染的机器中持续存在,或者…

    2022年9月20日
    80500
  • cad块名称如何修改

    cad块名称修改方法: 1、首先打开CAD软件。 2、然后点击上面任务选项栏中的“格式”。 3、然后点击菜单中的“重命名”。 4、最后点击左侧的“块”然后编辑右侧的名字即可。 以上就是“cad块名称如何修改”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家…

    2022年8月30日
    1.0K00
  • pr如何修改视频里的文字

    pr修改视频里的文字的方法: 1、首先点击左上角的字幕,然后选择新建字幕,再点击“默认静态字幕”。 2、然后输入自己需要的文字大小和相关的颜色。 3、建议大家使用常规的字体,不然容易出现不完整的情况。 4、添加之后可以将字幕的原件直接拖拽到上面的视频图层中。 5、然后就可以看到文字已经添加成功了。 …

    2022年8月29日
    2.0K00
  • mysql远程连接不上怎么解决

    解决方法:1、利用“select host,user from user;”查看root用户的可连接权限主机范围;2、利用“update user set host=‘%’ where user=‘root’;”修改root用户的修改权限的主机范围是任一主机;3、利用“systemctl resta…

    2022年9月16日
    1.7K00
  • word字体放大如何弄

    word字体放大的方法 1、先选中需要放大的字体,然后点击开始菜单中的增大字号。 2、选中字体之后在悬浮框中点击字体大小就可以设置了。 3、选中需要放大的字体之后,点击上方菜单栏中的输入框,直接在里面输入你要的字号。 以上就是“word字体放大如何弄”这篇文章的所有内容,感谢各位的阅读!相信大家阅读…

    2022年9月10日
    52100
  • Excel small函数如何使用

    一、函数语法: SMALL(array,k) k 为返回的数据在数组或数据区域里的位置(从小到大)。 array 查找的数据区域。 二、SMALL函数使用实例: 1.数组是A3到A7,从中查找最小数和倒数第二小的数。 2.在C4单元格输人=SMALL(A3:A7,1), 3.回车以后C4单元格取得最…

    2022年9月2日
    54900
  • MySQL5.7.31怎么安装和配置

    一、 下载MySQL 1. 选择想要安装的版本,点击Download下载 本篇文章选择的是5.7.31版本 二、 安装MySQL 1. 选择设置类型 双击运行mysql-installer-community-5.7.31.0.msi,这里选择是自定义安装,所以直接选择“Custom”,点击“Nex…

    2022年9月16日
    69800
  • SQLMAP插件tamper编写与使用的方法是什么

    一、SQLMAP插件tamper简介 我们在安装SQLMAP后,一般来说会有一个名为tamper的目录,在该目录下,有很多python脚本,这些python脚本,就是sqlmap的插件,tamper翻译成中文是过滤的意思,这些脚本,对sqlmap的payload进行一定的修改,将其中容易被拦截的关键…

    2022年8月27日
    98000
注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部