通用语法:select 窗口函数 over (partition by 分组列名, order by 排序列名)
专用窗口函数:
rank函数:如按班级名称分类,按序号正序,用rank函数实现,相同序号会出现并列ranking值
SELECT*, RANK() over (partition by `NAME` ORDERBY NUM)as ranking FROM f0627
结果
name num ranking
A 11
A 22
A 33
A 44
A 65
B 21
B 21
B 83
sql说明:rank为排序函数,通过partition by按照班级名称分组(此处不会类似group by将数据去重),然后按照序号正序,最后得到的rangking字段就是分类后的排序结果。
SELECT*, ROW_NUMBER() over (partition by `NAME` ORDERBY NUM)as ranking FROM f0627
结果
name num ranking
A 11
A 22
A 33
A 44
A 65
B 21
B 22
B 83
sql说明:rank为排序函数,通过partition by按照班级名称分组(此处不会类似group by将数据去重),然后按照序号正序,最后得到的rangking字段就是分类后的排序结果,观察ranking结果忽略了并列情况。
SELECT*, SUM(NUM) over (partition by `NAME` ORDERBY NUM)as'求和'FROM f0627
结果
name num 求和
A 11
A 23
A 36
A 410
A 616
B 24
B 24
B 812
sql说明:sum()为求和函数,通过partition by按照班级名称分组(此处不会类似group by将数据去重),然后按照序号正序,将每种分类第一行至当前行的序号累加结果汇总至‘求和’字
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
avg()函数:在上面sum函数基础上,增加avg函数计算平均值
SELECT *, SUM(NUM) over (partition by `NAME` ORDER BY NUM) as '求和', AVG(NUM) over (partition by `NAME` ORDER BY NUM) as '平均' FROM f0627
结果
name num 求和 平均
A 1 1 1.0000
A 2 3 1.5000
A 3 6 2.0000
A 4 10 2.5000
A 6 16 3.2000
B 2 4 2.0000
B 2 4 2.0000
B 8 12 4.0000
sql说明:avg()为平均值函数,通过partition by按照班级名称分组(此处不会类似group by将数据去重),然后按照序号正序,将每种分类第一行至当前行的序号累加结果求平均值至‘平均’字段
WITH cte as (SELECT *, SUM(NUM) over (partition by `NAME` ORDER BY NUM) as suming, AVG(NUM) over (partition by `NAME` ORDER BY NUM) as avging FROM f0627)
SELECT * FROM cte where avging > 2
结果
name num suming avging
A 4 10 2.5000
A 6 16 3.2000
B 8 12 4.0000
sql说明:with cte as (sql) 将sql结果可以定义为cte的派生表,可以直接查询派生表过滤平均值大于2的结果。
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
总结
Mysql 8.0新增的窗口函数极大简化了sql实现语句,实现了更加复杂的数据逻辑,可以满足更多的开发场景,从而相应减少了代码开发成本。