经常会出现需要排序的问题,比如说学生成绩相同的时候以什么规则进行排序。
排序使用到以下三个函数:
Row_number/rank/dense_rank:
原表如下
test_table:
name score
zhangsan 98
lisi 95
wangwu 95
zhaoliu 95
zhuqi 90
效果比较:
1)SELECT row_number() over(order by score desc) rn,*
from test_table;
结果:
rn name score
1 zhangsan 98
2 zhaoliu 95
3 wangwu 95
4 lisi 95
5 zhuqi 90
排序字段值相同时,任意先后顺序排序。
2)SELECT rank() over(order by score desc) rn,*
from test_table;
结果:
rn name score
1 zhangsan 98
2 lisi 95
2 zhaoliu 95
2 wangwu 95
5 zhuqi 90
排序字段值相同时,均默认为第一次出现的排名,且接下来的排名以前一个排名的个数向下排列。
3)SELECT dense_rank() over(order by score desc) rn,*
from test_table;
rn name score
1 zhangsan 98
2 lisi 95
2 zhaoliu 95
2 wangwu 95
3 zhuqi 90
排序字段值相同时,均默认为第一次出现的排名,且接下来的排名紧跟上个排名。