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

相关推荐

  • windows驱动精灵启动鼠标不动如何解决

    驱动精灵启动鼠标不动: 答:这是最新版的驱动精灵的bug。 这样的情况和电脑没有关系,是软件版本更新后造成的bug。 解决方法: 1、启动驱动精灵后,尝试拔出鼠标的USB接口,然后重新插入连接。 鼠标即可继续恢复正常使用。 2、强制重启电脑,重启时拔掉鼠标usb插口。 开机后再次插入连接即可。 驱动…

    2022年9月13日
    37300
  • echarts如何使用

    echarts使用方法 1、要使用Echarts的前提就是要引入echarts文件, echarts.js文件可以去echarts的官方中文网站里下载 2、进入官网之后,选择一个你想要绘制的图形。 3、这里我们选择折线图,然后看一下各个部分的具体含义。 title就是图标中的标题,在图标的左上角 4…

    2022年9月26日
    33800
  • 用于解析mac地址的协议是哪个

    用于解析mac地址的协议是“RARP”。RARP(反向地址转换协议)可以将MAC地址解析为IP地址,允许局域网的物理机器从网关服务器的ARP表或者缓存上请求其IP地址。RARP发出要反向解析的物理地址并希望返回其对应的IP地址,应答包括由能够提供所需信息的RARP服务器发出的IP地址。 本教程操作环…

    2022年9月18日
    53800
  • java垃圾收集器有哪些及怎么使用

    垃圾收集器如何演化的? 垃圾收集器的发展路线,简单来说是随着内存越来越大而发生变化。 从分代算法逐渐演化为不分代算法。 从serial的几十兆,逐渐演化到parallel的几个G,再到CMS的几十个G,也从此开始了并发回收。 年轻代收集器 Serial 特点:年轻代、串行回收、STW、简单高效 Se…

    2022年9月15日
    68300
  • 用于黑客渗透测试的Linux工具有哪些

    用于黑客渗透测试的 Kali Linux 工具 Kali Linux 预装了几种类型的工具。如果你发现有的工具没有安装,只需下载并进行设置即可。这很简单。 1、Nmap Nmap Nmap (即 “ 网络映射器(Network Mapper)”)是 Kali Linux 上很受欢迎的信息收集工具之一…

    2022年9月1日
    72100
  • svchost.exe可不可以关掉

    “svchost.exe”可以关掉;“svchost.exe”是一个用于加载系统服务项或者dll模块用的一个系统进程,不需要的时候可以关闭,只需在任务管理器中找到“svchost.exe”进程,右键选择“转到服务”,之后右键停止服务即可。 本教程操作环境:windows7系统、DELL G3电脑。 …

    2022年9月2日
    97800
  • mysql中事务和存储过程指的是什么

    在mysql中,事务是用户定义的一个数据操作序列,包含了一组数据库操作命令;事务把所有的命令作为一个整体一起向系统提交或撤销操作请求,即这一组数据库命令要么都执行,要么都不执行,因此事务是一个不可分割的工作逻辑单元。存储过程是一组为了完成特定功能的SQL语句集合;一个存储过程是一个可编程的函数,它在…

    2022年9月26日
    49800
  • html中头部标签是什么

    html中“<head>”是头部标签。head标签用于定义文档的头部,它是所有头部元素的容器;文档的头部描述了文档的各种属性和信息,包括文档的标题、在Web中的位置以及和其他文档的关系等。head中的元素有base、link、meta、script、style、title。 本教程操作环…

    2022年9月15日
    84000
  • SpringBoot登录验证token拦截器如何实现

    用户访问接口验证,如果用户没有登录,则不让他访问除登录外的任何接口。 实现思路: 1.前端登录,后端创建token(通过JWT这个依赖),返给前端 2.前端访问其他接口,传递token,后端判断token存在以或失效 3.失效或不存在,则返回失效提示,前端根据接口返回的失效提示,让其跳转到登录界面 …

    2022年9月20日
    69500
  • edxposed框架+trustmealredy模块如何实现抓包小程序

    一、下载edxposed框架,由于安卓5.0版本以下的不支持老版本的框架,所以到如下链接下载 https://forum.xda-developers.com/showthread.php?t=3034811 直接点击下载 二、下载trustmealredy https://repo.xposed.…

    2022年9月8日
    1.1K00
站长微信
站长微信
电话联系

400-800-1024

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

分享本页
返回顶部