案例:一门考试,每个人有三次考试机会,取分数最高的为最终成绩。
列出所有人的最终成绩。
比如成绩如下表:
姓名 |
分数 |
张三 |
80 |
张三 |
90 |
张三 |
100 |
李四 |
70 |
李四 |
90 |
李四 |
80 |
王五 |
100 |
假如表名为:分数表
应该这样写:
第一步:分组,排序,序号
SELECT 姓名, 分数, ROW_NUMBER() OVER (PARTITION BY 姓名 ORDER BY 分数 DESC) AS 序号 FROM 分数表
结果如下:
姓名 |
分数 |
序号 |
张三 |
80 |
3 |
张三 |
90 |
2 |
张三 |
100 |
1 |
李四 |
70 |
3 |
李四 |
90 |
1 |
李四 |
80 |
2 |
王五 |
100 |
1 |
第二步,在结果表中再查:
SELECT 姓名, 分数 FROM ( SELECT 姓名, 分数, ROW_NUMBER() OVER (PARTITION BY 姓名 ORDER BY 分数 DESC) AS 序号 FROM 分数表 ) AS vw WHERE 序号= 1
内层查询,根据“姓名”分组,然后在分组内根据“分数”降序排列,给分组内每条记录一个序号。