SQL开窗函数over()的用法实例

最近用到了开窗函数,但我在本地想要学习用法时,本地的MySql服务器版本太低不支持该函数,故转载其他人的博客记录一下,待以后再详细还原。

开窗函数的详细用法

一,开窗函数的语法

开窗函数的语法为:over(partition by 列名1 order by 列名2 ),括号中的两个关键词partition by 和order by 可以只出现一个。over() 前面是一个函数,如果是聚合函数,那么order by 不能一起使用。

二,从聚合开窗函数sum(score) over(partition by name )讲起

sum(score) over(partition by name )
sum()是聚合函数,其实我聚合函数还没学明白,当 sum()函数 后面跟上 over()以后,由sum聚合函数就成为了开窗函数。
over() 括号里面就是定义窗口的内容了,partition 是分区,分组的意思。partition by 就是根据某个字段分组。
所以sum(score) over(partition by name ) ,就是先根据 name 分组,当前面加了sum(score)后就把根据那么分组后的,每个(组)窗口里面的字段 score进行求和操作。

select *,sum(score)  over(partition by name) sum窗口函数举例
from kchs
-- 为了简单就只有两个字段,name和score

在这里插入图片描述

聚合函数同样需要对数据进行排序,但不会显示排名结果。会将当前名次的数据 与 排在这之前的所有数据 依次做相应的计算。

执行语句:

select *,
sum(score) over (order by id) as 累加求和
from kchs

在这里插入图片描述

拓展一下:
一,很多聚合函数都可以用作窗口函数的运算,如SUM、AVG、MAX、MIN、COUNT。
二,和graup by 不同的是窗口函数会生成多行,而不是想graup by 一样只有一行

三,开窗函数之first_value,last_value,lead,lag
first_value:是在窗口里面取到第一个值

first_value(score) over( partition by name)as first_score ,
-- 根据name分区(组),取score列的第一个值

last_value:是在窗口里面取到最后一个值

last_value(score) over(partition by name) as last_score
-- 根据name分区(组),取score列的最后一个值

lead 是取当前行的上 N 条数据,并且可以设置默认值

lead(score,1,0) over(partition by name ) as lead_score
-- 根据name分区(组),score列当前行的上面N行,,如果没有就为默认值0

lag 是取当前行的下 N 条数据,并且可以设置默认值

lag(score,1,0) over(partition by name ) as lag_score 
--根据name分区(组),score列当前行的下面N行,如果没有就为默认值0

在这里插入图片描述

四,排名开窗函数ROW_NUMBER、DENSE_RANK、RANK
row_number ()是为每组的行设置一个连续的递增的数字(123456)

ROW_NUMBER() over( partition by name order by score asc)as ROW_NUMBER_score 

rank()是排名,也为每一组的行生成一个序号,如果有相同的值会生成相同的序号,并且接下来的序号是不连序的。例如:有三个人并列第一名,第四名序号为四(111456)

rank() over(partition by name order by score asc) as RANK_score

DENSE_RANK()和RANK()类似,不同的是如果有相同的序号,那么接下来的序号不会间断。例如:有三个人并列第一,第四名序号为2(111234)

DENSE_RANK() over(partition by name order by score asc) as DENSE_RANK_score

在这里插入图片描述

注意:
一,排名开窗函数可以单独使用ORDER BY 语句,也可以和PARTITION BY同时使用。
二,ORDER BY 指定排名开窗函数的顺序,在排名开窗函数中必须使用ORDER BY语句。
三,PARTITION BY用于将结果集进行分组,开窗函数应用于每一组。

————————————————
版权声明:本文为CSDN博主「悲且狂」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/baomingshu/article/details/111945681

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值