SQL高级知识:开窗函数

news2024/11/15 21:50:01

点击关注公众号,SQL干货及时获取

后台回复:1024,获取海量学习资源

SQL刷题专栏

SQL145题系列

开窗函数的定义

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

开窗函数的语法

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

  • PARTITION BY 子句进行分组;

  • ORDER BY 子句进行排序。

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

开窗函数的用法

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

聚合类开窗函数使用示例

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

--建立测试表和测试数据

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

结果如下:

6e4335c50b021dd69d9e24c92d827301.png

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

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;

返回的结果如下图:

e5466d10df043bab36b5933e2d48e835.png

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

排序类开窗函数使用示例

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

--先建立测试表和测试数据

WITH t AS
(SELECT 1 StuID,'一班' ClassName,70 Score
UNION ALL
SELECT 2,'一班',85
UNION ALL
SELECT 3,'一班',85
UNION ALL
SELECT 4,'二班',80
UNION ALL
SELECT 5,'二班',74
UNION ALL
SELECT 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;

结果如下:

ed2671a4d15e893a08ab9f835179955e.png

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

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

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

结果如下:

dbef472865d73d81eb7dae8819b0d4cd.png

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;

结果:

968a8ae085704b89da6beb34db861fd4.png 3c6a304db4309f2d1fa11acc8144f676.png

其中上图是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;

结果如下:

ec55b106769e8f27c4e45055bafb61de.png b5db454798db31e26ba112477733655d.png

上面是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;

结果如下:

2ad3405891ed3f895edcc59ce503018a.png 941739520ef41cab22d1d198933c1aa0.png 0257d280a0eaa0f3b39f7aa29bcd569d.png

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

6a05a26c5b089f7e24a886045919e7e0.gif

最后给大家分享我写的SQL两件套:《SQL基础知识第二版》《SQL高级知识第二版》的PDF电子版。里面有各个语法的解释、大量的实例讲解和批注等等,非常通俗易懂,方便大家跟着一起来实操。

有需要的可以下载学习,只需要在下面的公众号「数据前线」(非本号),后台回复关键字:SQL,就行

 
 

数据前线

a57576bb8d97e962463cc591f42c7c57.jpeg

 
 

后台回复关键字:1024,获取一份精心整理的技术干货

后台回复关键字:进群,带你进入高手如云的交流群。

 
 
推荐阅读
  • 很多朋友都消失了。。

  • 同事问工资,我悟了!

  • 学 SQL 必须了解的10个高级概念

  • 艹!就写了个 insert into select ,居然被开了

  • SQL学习路线图

9942594136ac86917885c2a97e80ef03.gif

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1711717.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

重学java 49 List接口

但逢良辰,顺颂时宜 —— 24.5.28 一、List接口 1.概述: 是collection接口的子接口 2.常见的实现类: ArrayList LinkedList Vector 二、List集合下的实现类 1.ArrayList集合的使用及源码分析 1.概述 ArrayList是List接口的实现类 2.特点 a.元素有序 —> 按照什么顺…

【Flutter】显式动画

🔥 本文由 程序喵正在路上 原创,CSDN首发! 💖 系列专栏:Flutter学习 🌠 首发时间:2024年5月29日 🦋 欢迎关注🖱点赞👍收藏🌟留言🐾 目…

ORA-12514:TNS:监听程序当前无法识别连接描述符中请求的服务

ORA-12514:TNS:监听程序当前无法识别连接描述符中请求的服务 问题描述: 解决方案: 1、检查oracle的监听服务是否运行正常 1)点击键盘的winr,输入services.msc,点击确认/回车键; 2)查…

2023年信息素养大赛小学组C++智能算法复赛真题

今天给大家分享2023年全国青少年信息素养大赛小学组C智能算法挑战赛复赛里面的一套真题,希望有助于大家了解复赛的难度及备考。 其他真题下载:网盘-真题-信息素养大赛

PyTorch安装与配置

前言 参考文档:https://github.com/TingsongYu/PyTorch-Tutorial-2nd 环境配置之Anaconda 解释器——python.exe,是人类与CPU之间的桥梁,需要配置系统环境变量 Anaconda:集成环境,包管理器 Conda 安装 Anaconda&am…

12.2 通道-阻塞与流程控制、通道型函数、退出通道

阻塞与流程控制 通常在并发程序中要尽力避免阻塞式操作,但有时又需要让代码暂时处于阻塞状态,以等待某种条件、信号或数据,然后再继续运行。 对于无缓冲通道,试图从无人写入的通道中读取,或者向无人读取的通道中写入…

学习笔记——数据通信基础——数据通信网络(拓扑结构)

网络拓扑 网络拓扑(Network Topology)是指用传输介质(例如双绞线、光纤等)互连各种设备(例如计算机终端、路由器、交换机等)所呈现的结构化布局。 1、网络拓扑形态 星型网络∶所有节点通过一个中心节点连接在一起。 优点∶容易在网络中增加新的节点。通信数据必须经过中心节点…

学习Uni-app开发小程序Day21

学习了评分组件、自定义导航栏 评分组件uni-rate 这是需要达到的效果图,这里先分析下效果图, 1、图片是从布局中间弹出的,那这里就要用到uni-popup ,设置type从中间弹出 2、这个弹出的顶部和上一张的顶部布局是一样的&#xff0c…

C# 反射GetProperties和GetFields的坑

有时候使用反射,获取类的所有字段和所有属性,一般情况下是按照我们写的先后顺序返回的。 但是我今天碰到了一次不是按照顺序返回的!!! 翻看文档: GetProperties: https://learn.microsoft.com/…

【C++】从零开始构建红黑树 —— 节点设计,插入函数的处理 ,旋转的设计

送给大家一句话: 日子没劲,就过得特别慢,但凡有那么一点劲,就哗哗的跟瀑布似的拦不住。 – 巫哲 《撒野》 🌋🌋🌋🌋🌋🌋🌋🌋 ⛰️⛰️…

WordPress建网站公司 建易WordPress建站

建易WordPress建网站公司是一家专业从事WordPress网站建设、网站维护、网站托管、运营推广和搜索引擎优化(SEO)等服务的公司。建易WordPress建网站公司提供多种服务,包括模板建站和定制网站,并且明码标价,价格透明,竭诚为全国各地…

常见5大开发进度盲点问题及解决方案

在软件开发项目中,识别并解决常见的进度管理盲点问题,对于确保项目按时、按预算、高质量完成至关重要。它直接关系到项目能否顺利进行,忽视任何一个问题,都可能导致项目延期、成本超支、质量下降,甚至项目失败。 因此&…

G60-M60F-ZQ手动抓取快速接头,专用于吊装设备的重物快速抓取

客户需求概述: 客户需要将重达将近400公斤的产品从一个工作台移动至另一个工作台,目前的方法是通过人工将吊环的螺纹与产品的螺纹相互拧紧,然后利用装备吊起移动,但这种方式效率低下,且因为工人的操作有时难以达到理想…

CHIMA专访美创高级总监丁斐:为医疗数据安全构筑体系化防御新机制

5月17-19日,中国医院信息网络大会(CHIMA 2024)在南京隆重召开。作为结识多年的老友,美创科技再携以数据为中心的全系列安全业务、新一代数字化安全平台、医疗行业解决方案精彩亮相。 会议期间,CHIMA专访美创科技&…

Linux之sshpass命令

介绍 sshpass是一个工具,用于通过SSH连接到远程服务器时自动输入密码。它允许您在命令行中指定密码,以便在建立SSH连接时自动进行身份验证。 安装 # 以centos为例 yum install sshpass -y 使用方法 sshpass [-f filename | -d num | -p password | …

精酿啤酒:品质与口感在啤酒品牌形象建设中的作用

啤酒品牌形象建设是提升市场竞争力的关键,而品质与口感在其中扮演着重要的角色。对于Fendi club啤酒而言,其卓着的品质和与众不同的口感在品牌形象建设中发挥了积极的作用。 品质是啤酒品牌形象的核心要素。消费者对啤酒品质的要求越来越高,品…

新书推荐:7.5 goto、break、continue语句

本节必须掌握的知识点: 示例二十六 代码分析 汇编解析 示例二十七 代码分析 汇编解析 7.5.1 示例二十六 ■goto语句:无条件转移语句。 语法格式: goto label; label : 代码; ●语法解析: 执行到goto语句时,则无…

【PB案例学习笔记】-10 进度条使用

写在前面 这是PB案例学习笔记系列文章的第10篇,该系列文章适合具有一定PB基础的读者。 通过一个个由浅入深的编程实战案例学习,提高编程技巧,以保证小伙伴们能应付公司的各种开发需求。 文章中设计到的源码,小凡都上传到了gite…

【python】OpenCV—Tracking(10.2)

文章目录 BackgroundSubtractorcreateBackgroundSubtractorMOG2createBackgroundSubtractorKNN BackgroundSubtractor Opencv 有三种背景分割器 K-Nearest:KNN Mixture of Gaussian(MOG2) Geometric Multigid(GMG) …

酒店提前线上订房小程序源码系统 PHP+MySQL组合开发 源码开源可二开 带完整的安装代码包以及搭建教程

系统概述 随着移动互联网的普及,越来越多的人习惯通过手机进行酒店预订。传统的线下订房方式逐渐无法满足用户的需求,酒店提前线上订房小程序的出现成为必然趋势。该源码系统的开发旨在为酒店提供一个便捷、高效的线上订房平台,提升用户体验…