1.定义:
- 窗口函数(OLAP函数:Online Anallytical Processing,联机分析处理),可以对数据库数据进行实时分析处理。
2.功能:
- 同时具有分组(partition by)和排序(order by)的功能
- 不减少原表的行数,所以经常用来在每组内排名
3.使用位置与场景:
- 原则上只能写在select子句中。
- 可应用于在每组内排名的场景。
4.语法:
- []中的内容可以省略
- <窗口函数> over ([partition by <列清单>]
- order by <排序用列清单>)
- partition by:设定排序的对象范围,类似group by语句。
- order by:指定列进行排序,也可以通过asc,desc来指定升序降序
5、窗口函数类型
- 专用窗口函数,包括rank, dense_rank, row_number等
- ①rank函数:计算排序时,如果存在相同位次的记录,则会跳过之后的位次。
②dense_rank函数:同样是计算排序,即使存在相同位次的记录,也不会跳过之后的位次。
③row_number函数:赋予唯一的连续位次。
- 聚合函数,sum. avg, count, max, min等
聚合函数作为窗口函数,可以在每一行的数据里直观的看到,截止到本行数据,统计数据是多 少(最大值、最小值等)。同时可以看出每一行数据,对整体统计数据的影响。
注意:当为聚合函数时,order by还起到窗口内从当前行到之前所有行的聚合,不加order by 的话,就是针对一整个分区进行聚合。加上order by后,就是根据当前行到之前所有行聚合。
6、举例具体说明:
- 专用窗口函数
学号 | 班级 | 成绩 |
0001 | 1 | 86 |
0002 | 1 | 95 |
0003 | 2 | 89 |
0004 | 1 | 83 |
0005 | 2 | 86 |
0006 | 3 | 92 |
0007 | 3 | 86 |
0008 | 1 | 88 |
#按班级分组,对成绩排序
select *,
rank() over (partition by 班级
order by 成绩 desc) as ranking
from 班级表;
学号 | 班级 | 成绩 | ranking |
0002 | 1 | 95 | 1 |
0008 | 1 | 88 | 2 |
0001 | 1 | 86 | 3 |
0004 | 1 | 83 | 4 |
0003 | 2 | 89 | 1 |
0005 | 2 | 86 | 2 |
0006 | 3 | 92 | 1 |
0007 | 3 | 86 | 2 |
- 聚合窗口函数
select *,
sum(成绩) over (partition by 班级order by 学号) as current_sum1,
#按照班级分组,学号排序,对成绩到当前行求和
sum(成绩) over (partition by 班级) as current_sum2
#按照班级分组,对成绩求和
from 班级表;
学号 | 班级 | 成绩 | current_sum1 | current_sum2 |
001 | 1 | 86 | 86 | 181 |
002 | 1 | 95 | 181 | 181 |
003 | 2 | 89 | 89 | 172 |
004 | 2 | 83 | 172 | 172 |
005 | 3 | 86 | 86 | 178 |
006 | 3 | 92 | 178 | 178 |