MySQL Over 函数
MySQL Over 函数
MySQL 8.0.2 中引入了 Window 函数,用于对返回的行及其关联的行进行一些计算操作,这些被计算的行则是通过 OVER 函数定义的。
连带会涉及 PARTITION BY 语句,该语句使用在 OVER() 函数中,合作作用之后形成的数据行也叫作 Window,然后可用于所有 Window 函数譬如 RANK,LEAD,LAG 等,也可用于大部分聚合函数譬如 AVG ,SUM...
这么说有些抽象,举个例子,考察如下数据表:
| h_id | h_name | challenge_id | score |
|---|---|---|---|
| 3 | shubh | 111 | 20 |
| 2 | aayush | 111 | 80 |
| 5 | krithik | 112 | 40 |
| 5 | krithik | 114 | 90 |
| 4 | tushar | 112 | 30 |
| 1 | parth | 112 | 40 |
记录了不同人参加不同比赛的得分,现在想统计出每个人在单个比赛中的排名,可以这样写:
SELECT challenge_id,
h_id,
h_name,
score,
dense_rank() OVER (PARTITION BY challenge_id
ORDER BY score DESC) AS "rank",
FROM hacker;
上述语句中,
PARATITION BY将结果集按challenge_id即不同的比赛进行分组,ORDER BY将每个分组中的人按得分降序排列- 上述两个语句结合
OVER()形成一个 Window,作为 Window 函数dense_rank()的入参 dense_rank()为排序后的分组创建order列
执行结果:
| challenge_id | h_id | h_name | score | rank |
|---|---|---|---|---|
| 111 | 2 | aayush | 80 | 1 |
| 111 | 3 | shubh | 20 | 2 |
| 112 | 5 | krithik | 40 | 1 |
| 112 | 1 | parth | 40 | 1 |
| 112 | 4 | tushar | 30 | 2 |
| 114 | 5 | krithik | 90 | 1 |
以上。