SQL窗口函数

参考https://zhuanlan.zhihu.com/p/92654574

窗口函数有什么用?

例如,对公司内各个部门内的员工,按业绩排名,又或者找出每个部门排名前N的员工进行奖励。
这种情况不是把公司里所有员工放在一起排名,而是把不同部门的员工分开排名,就需要用到窗口函数。

窗口函数是什么?

可以用于对数据集进行实时分析处理
语法如下:

<窗口函数> over (partition by <用于分组的列名>
                order by <用于排序的列名>)

<窗口函数>的位置,可以放以下两种函数:
1) 专用窗口函数,包括后面要讲到的rank, dense_rank, row_number等专用窗口函数。
2) 聚合函数,如sum. avg, count, max, min等

举个例子

select *,
   rank() over (partition by 班级
                 order by 成绩 desc) as ranking
from 班级表

partition by是对表分组
order by是对分组后的结果按某个指标排序

为什么不用group by?

group by函数和聚合函数一起使用时会改变表的行数,聚合出的一类只对应一行;而partition by则不会:

图片说明

专业窗口函数rank, dense_rank, row_number

区别在于在排序的时候是否考虑并列的情况,是自增1还是遇到并列取相同值;以及对于并列的情况是否占用后续的名次;

图片说明

聚合函数

sum求和,avg平均、count计数、max最大min最小值,都是针对自身记录、以及自身记录之上的所有数据进行计算;
聚合函数作为窗口函数,可以在每一行的数据里直观的看到,截止到本行数据,统计数据是多少(最大值、最小值等)。同时可以看出每一行数据,对整体统计数据的影响。

图片说明

注意

聚合函数与专业窗口函数在用作窗口函数时其区别在于聚合函数括号内必须指定聚合的列名,而专业窗口函数不需要,它是在order by里指定;

窗口函数原则上只能写在select子句中;

全部评论

相关推荐

在改简历的大卫很认真:天天有面试 = 你已经在 offer 门口了。 海投能面成这样,说明你的简历、基础、学历都是过关的,缺的只是一次刚好匹配的缘分。 关于你说的 SQL 恐惧,我帮你捋一下: - 面试里考来考去,真就那几类: 分组、去重、关联、子查询、窗口函数(row_number、rank、sum 开窗) ​ - 面试官要的不是“写得花里胡哨”,而是思路稳、不出错。 你恐惧的本质不是不会, 是怕临场卡壳、怕写错、怕被追问。
点赞 评论 收藏
分享
02-28 01:18
已编辑
南昌大学 后端工程师
后测速成辅导一两个月...:把开源经历放个人项目上边应该更好,就像大部分人都把实习经历放个人项目上边
点赞 评论 收藏
分享
评论
1
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务