当前位置:首页>热门 > >正文

每日热门:重学SQL窗口函数

  • 2023-05-18 11:29:33来源:博客园

窗口函数语法

SQL窗口函数是SQL中的一种高级函数,它允许用户在不显式分组查询的情况下对结果集进行分组和聚合计算。窗口函数的特别之处在于,它们将结果集中的每一行看作一个单独的计算对象,而不是将结果集划分为分组并计算每个分组的聚合值。这就使得窗口函数能够为结果集中的每一行计算类似排名、行号、百分比和移动聚合函数等值。

SQL窗口函数的语法如下:


(资料图片仅供参考)

<窗口函数> OVER ([PARTITION BY <分组列> [, <分组列>...]]                     [ORDER BY <排序列> [ASC | DESC] [, <排序列> [ASC | DESC]]...]                     [])

其中:

  • <窗口函数>: 定义要在窗口中计算的聚合函数或其它分析函数,如COUNT、RANK、SUM等。
  • OVER: 窗口函数的核心关键字。
  • PARTITION BY: 定义要用来分组的一组列名。
  • ORDER BY: 定义用来排序的一组列名。
  • : 定义窗口的行集合。默认为 ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW,表示窗口包括从窗口开始到当前行的所有行。

下面的例子说明了如何使用窗口函数计算每个部门的平均工资,并根据平均工资进行排名。

SELECT department, employee_name, salary,   AVG(salary) OVER (PARTITION BY department) average_salary,   RANK() OVER (PARTITION BY department ORDER BY salary DESC) salary_rankFROM employee;

在这个例子中,PARTITION BY定义了用于分组计算平均工资的列名,OVER后面依次定义了需要计算的列名和相应的窗口函数。 AVG(salary) OVER (PARTITION BY department)的意思是对于每个部门,计算 salary列的平均值,而 RANK() OVER (PARTITION BY department ORDER BY salary DESC)的意思是计算每个部门中 salary列的排名。SQL窗口函数的语法和用法比较复杂,但它极大地拓展了SQL查询的能力,使得更多复杂的查询可以得以实现。

更多说明

窗口函数是一种SQL函数,可以在不影响查询结果的情况下,为查询结果集中的每一行计算聚合函数、排名、行号等。

窗口函数的使用场景有很多,例如统计某个时间段内的每天销售量排名、计算每个部门的平均工资并与其他部门进行比较、计算每个产品上个月和本月的销售额变化等。

以下是一个使用窗口函数的查询示例和结果,该查询用于计算某个时间段内每天的销售量排名。

假设有一张包含销售信息的表sales,包括销售日期、销售量和产品ID等字段。

现在需要查询2021年1月1日至1月10日期间每天的销售量排名,包括每天的日期和排名信息。

以下是使用窗口函数实现该查询的SQL语句:

SELECT sale_date, sale_volume, ROW_NUMBER() OVER(PARTITION BY sale_date ORDER BY sale_volume DESC) as sales_rankFROM salesWHERE sale_date BETWEEN "2021-01-01" AND "2021-01-10"

该查询将sales表根据销售日期进行分组,计算每个日期的销售量,并使用ROW_NUMBER()函数为每个日期的销售量进行排名。

以下是该查询的查询结果:

sale_datesale_volumesales_rank
2021-01-01125001
2021-01-02138001
2021-01-03130001
2021-01-04118002
2021-01-05125001
2021-01-06140001
2021-01-07115001
2021-01-08128001
2021-01-09131001
2021-01-10129001

ps:上面的结果有问题。

SQL的窗口函数中常见的排序方法

SQL的窗口函数中常见的排序方法包括以下几种:

  1. ROW_NUMBER()函数:按照指定的列或表达式对结果集进行排序,并为排序后的每一行分配一个唯一的行号。
  2. RANK()函数:对结果集进行排序,并为排序后的相同值的行分配相同的排名,排名之间存在空缺。
  3. DENSE_RANK()函数:对结果集进行排序,并为排序后的相同值的行分配相同的排名,排名之间不存在空缺。
  4. CUME_DIST()函数:计算结果集中某个值在排序后出现的位置占总行数的比例。
  5. NTILE(n)函数:将结果集划分为n份,并为每个分组分配一个编号。

注意,以上窗口函数中的排序方法都是基于ORDER BY子句中指定的列或表达式的排序。

以下是五种窗口函数的排序方法及其例子:

  1. ROW_NUMBER():按照指定的排序方法为每行分配一个唯一的整数行号,行号从1开始递增。示例如下:
SELECT ROW_NUMBER() OVER (ORDER BY salary DESC) AS row_num, employee_name, salaryFROM employee;

该语句会对employee表按照salary字段降序排序,并为每行分配一个不重复的行号存储在row_num字段中。

  1. RANK():按照指定的排序方法为每行分配一个排名,相等值将被分配相同的排名并跳过下一个排名。示例如下:
SELECT RANK() OVER (ORDER BY total_sales DESC) AS ranking, region_name, total_salesFROM sales_summaryWHERE year = "2021";

该语句会对2021年销售总额按照降序排序,并为每行分配一个排名存储在ranking字段中。

  1. DENSE_RANK():按照指定的排序方法为每行分配一个密集排名,相等值将被分配相同的排名但不会跳过下一个排名。示例如下:
SELECT DENSE_RANK() OVER (ORDER BY exam_score DESC) AS rank, student_name, exam_scoreFROM exam_resultsWHERE exam_type = "final";

该语句会对final考试的成绩按照降序排序,并为每行分配一个密集排名存储在rank字段中。

  1. NTILE(n):将行分成n个近似相等的桶,并为每行分配一个桶号(从1到n)。示例如下:
SELECT NTILE(4) OVER (ORDER BY product_sales DESC) AS quartile, product_name, product_salesFROM product_summaryWHERE year = "2021";

该语句会将2021年产品销售额按照降序排序,并将其分成四个桶,为每行分配一个桶号存储在quartile字段中。

  1. LAG()/LEAD():LAG函数用于获取当前行之前的行数据,LEAD函数用于获取当前行之后的行数据。示例如下:
SELECT employee_name, salary,       LAG(salary, 1) OVER (ORDER BY salary) AS prev_salary,       LEAD(salary, 1) OVER (ORDER BY salary) AS next_salaryFROM employee;

该语句会对employee表按照salary字段排序,并为每行获取前一行和后一行的salary值存储在prev_salary和next_salary字段中。

窗口函数的常见场景

窗口函数是在SELECT语句中用来执行聚合、排序、排名等操作的一种特殊函数。它们操作一个窗口(Window)内的数据集,并返回一个与当前行相关的聚合结果。

以下是一些使用窗口函数的常见场景和示例:

  1. 排序:使用窗口函数的排名功能可以将结果按照指定的列进行排序,而不影响结果集中其他列的排序。例如,以下SQL语句用排名窗口函数将销售额进行降序排列,并在结果集中显示销售额排名的值:
SELECT order_no, order_date, customer_name, order_amount,           RANK() OVER (ORDER BY order_amount DESC) as rank    FROM orders;
  1. 聚合:窗口函数可以将数据集划分为多个分区,并在每个分区内执行聚合操作。例如,以下SQL语句使用SUM函数计算每个客户的累计销售额,并使用窗口函数将结果分区:
SELECT customer_name, order_date, order_amount,           SUM(order_amount) OVER (PARTITION BY customer_name ORDER BY order_date) as cumulative_sales    FROM orders;
  1. 分析:使用窗口函数的分析功能可以计算每行与其他行之间的差异。例如,以下SQL语句计算每个销售额相对于上一个销售额的增量,并使用窗口函数进行分析:
SELECT order_no, order_date, order_amount,           order_amount - LAG(order_amount, 1, 0) OVER (ORDER BY order_date) as sales_increase    FROM orders;

假设有一张包含学生成绩信息的表scores,包括学生ID,课程ID和成绩。现在需要查询每个学生最高成绩和次高成绩,并计算两者的差值(用作成绩提升分析)。

以下是使用窗口函数实现该查询的SQL语句:

SELECT student_id, MAX(score) as max_score,        LAG(MAX(score), 1, 0) OVER (PARTITION BY student_id ORDER BY score DESC) as second_max_score,        MAX(score) - LAG(MAX(score), 1, 0) OVER (PARTITION BY student_id ORDER BY score DESC) as score_gapFROM scoresGROUP BY student_id

该查询将scores表按照student_id分组,计算每个学生的最高成绩和次高成绩,并计算两者的差值。以下是该查询的查询结果:

student_idmax_scoresecond_max_scorescore_gap
195896
288826
3867511
492848
594913

以上是用markdown展示的查询结果,包括查询到的学生ID,最高成绩,次高成绩和两者的差值。

  1. 移动平均数:使用窗口函数的移动平均功能可以计算指定数量的前后数据行的平均值。例如,以下SQL语句计算每个销售额的一个2周滑动平均值,并使用窗口函数进行计算:
SELECT order_date, order_amount,           AVG(order_amount) OVER (ORDER BY order_date ROWS BETWEEN 13 PRECEDING AND CURRENT ROW) as moving_average    FROM orders;

这些只是窗口函数的一些常见用途和示例。实际上,窗口函数非常灵活,可以用于各种不同的数据分析和处理场景。

标签:

延伸阅读

推荐阅读

每日热门:重学SQL窗口函数

窗口函数语法SQL窗口函数是SQL中的一种高级函数,它允许用户在不显式分组查询的情况下对结果集进行分组和聚

孤独就诊者的“临时家属”“陪诊师”在泉州悄然兴起_焦点精选

“陪诊师”在泉州悄然兴起新职业有市场也亟待规范在泉州各医院直播陪诊泉州网5月18日讯(记者许奕梅文 图)

罗平锌电:全资子公司芦茅林铅锌矿改建工程联合试运转

5月18日,罗平锌电发布公告表示,全资子公司普定县向荣矿业有限公司(以下简称“向荣矿业”)近期收到安

港股黄金股反弹 坛金矿业涨超4%|天天新消息

港股黄金股反弹,截至发稿,坛金矿业(00621 HK)涨4 35%、紫金矿业(02899 HK)涨2 46%、中国黄金国际(02099 HK)涨2 01%。

SMM硅基光伏晨会纪要:电池片价格大幅走跌 多晶硅价格开始回稳 当前观点

近期电池片价格大幅走跌,N-Topcon电池片跌幅最大,价格直降1毛,跌至1 05元 W。高效单晶1

当前头条:2023年5月17日这只新股上市(蜂助手)

2023年5月17日这只新股上市(蜂助手),该股于2023年5月17日上市,上市地点:深圳证券交易所,证券简称:蜂

今头条!网游过度索取权限问题调查:玩个游戏,隐私都被扒光了

“只是玩个游戏而已,为什么要让我开通那么多权限呢?!”福建泉州的黎先生最近玩一款名为“××瓶子”的小游

【环球新要闻】酸菜饺子馅怎么调潮汕_酸菜饺子馅怎么调

你们好,最近小活发现有诸多的小伙伴们对于酸菜饺子馅怎么调潮汕,酸菜饺子馅怎么调这个问题都颇为感兴趣的

【天天快播报】word无法启动转换器WPFT532_word无法启动转换器mswr632

1、方法一:一直点“word无法启动转换器mswrd632wpc”下面的“确定”,它会出现文本内容

巴西加大科技创新投入

2023年里约网络峰会日前在巴西里约热内卢举行,来自90多个国家和地区的超过2万名参会者、900多家初创公司和

诸暨好吗?是小地方吗?属于哪个城市

诸暨是属于浙江省绍兴市管辖的;诸暨位于浙江省中北部,北邻杭州,东接绍兴,南临义乌,是一个县级市。诸暨

【天天新要闻】公司劳动合同模板

今天来聊聊关于公司劳动合同模板的文章,现在就为大家来简单介绍下公司劳动合同模板,希望对各位小伙伴们有

光明之神巴德尔故事-光明之神巴德尔

1、巴德尔。2、巴德尔是北欧神话中的光明之神,光辉美丽的化身,春天与喜悦之神,光的拟人化。3、他的父亲

【世界热闻】暗藏灯带宽度_暗藏灯带灯槽尺寸

1、你好,暗藏灯带指的在衣柜里部藏,隔板的厚度在4公分左右即可。2、分上下两层,中间为空心的夹层,可以

天天热资讯!键盘进水 按键失灵_键盘进水按键失灵啊简介介绍

对于键盘进水按键失灵啊这个问题感兴趣的朋友应该很多,这个也是目前大家比较关注的问题,那么下面小好小编

公积金贷款首付有哪些要求

公积金贷款是一种广受欢迎的房屋贷款方式,但是这种方式不是人人都可以使用的,还是需要具备一定的要求和条

13万亿美元未兑现!G7被批给“全球南方”开空头支票|世界视点

参考消息网5月17日报道据德国《时代》周报网站5月17日报道,慈善机构乐施会估计,组成七国集团(G7)的七个

天天热资讯!广西桂林几月份去最好 广西桂林多少月份去最好

1、广西桂林最佳旅游季节是在每年4-10月。5月下旬进入雨季,漓江水位会涨,水流急且浑浊,不利于看倒影,但

全球快消息!财信地产所持财信发展全部股份被司法冻结 占总股本36.25%

5月17日,财信地产发展集团股份有限公司发布公告称,控股股东重庆财信房地产开发集团有限公司所持股份被司

本地经济数据疲软加上隔夜美股低迷 导致海指下滑1.25% 全球速看料

本地非石油国内出口(NODX)数据疲软加上隔夜美股低迷,导致新加坡海峡时报指数星期三(5月17日)大幅下滑4

鸟窝都是“露天向上”的,遇到雨天咋办?看完才知道鸟多聪明

时光过得飞快,转眼间就这一年我们是过了一半了,这一年的时光转瞬即逝,那么你又把握住了多少的时光呢?从

2023年湖北鄂州市事业单位公开招聘工作人员资格复审递补公告(一) 焦点简讯

一、资格复审递补情况市交通运输局市港航海事事业发展中心船舶检验岗位计划招聘1个,因第3名考生张*放弃资

四连杀,7-0!国米三线碾压米兰,49年首次赛季四杀死敌

欧冠半决赛,国米两回合2-0、1-0双杀米兰,再加上意超杯与意甲联赛的胜利,国米完成了2023年度对米兰的四连

港股日报 | 恒生指数跌2.09%,南向资金净买入67.78亿港元,汽车板块领涨

截至2023年5月17日港股收盘,恒生指数跌2 09%,报19560 57点;恒生国企指数跌2 25%,报6636 66点;恒生科技指

《富翁大作战》比起运气更考验智慧的大富翁游戏-每日讯息

《富翁大作战》是一款线上多人联机考验智慧和运气的大富翁游戏,适合2-6个玩家的桌游。一、游戏体验首先《

马斯克发推文攻击索罗斯,把他比喻成《X战警》反派“万磁王”

“今日俄罗斯”(RT)报道称,马斯克16日在推特平台发布上述言论攻击美国金融大鳄乔治·索罗斯,将后者比作

天天最资讯丨中国星辰|北斗升空!他们用自主创新奋进世界一流

演唱:黑鸭子组合 作词:丁小炜 作曲:刘介华2023年5月17日10时49分,我国在西昌卫星发射中心用长征三号乙

【港股异动】华润置地(01109.HK)跌3.07%_要闻速递

【财华社讯】微创医疗(00853 HK)截至14:37下跌7 12%,现报15 14港元,跌1 16港元。成交651万股,涉资1 001

【独家】冷空气携大雨来 上海入夏倒计时可能中断

冷空气携大雨来上海入夏倒计时可能中断---昨夜今晨,一场雨浇灭了上海的“热”情,也极有可能阻断了入夏的

环球热点!石家庄桥西区拟征收留营村约434亩土地 开发建设住宅、交通等

观点网讯。5月16日,石家庄桥西区政府网站发布了一则征收土地预公告,拟征收留营村位于东至西二环、南至新

猜您喜欢

Copyright ©  2015-2022 大众服装网版权所有  备案号:豫ICP备20014643号-14   联系邮箱: 905 14 41 07@qq.com