语法:RANK ( ) OVER ( [query_partition_clause] order_by_clause )。
一个例子:
TABLE:S (subject,mark)
数学,80
语文,70
数学,90
数学,60
数学,100
语文,88
语文,65
语文,77
现在想要的结果是:每门科目的前3名的分数
数学,100
数学,90
数学,80
语文,88
语文,77
语文,70
那么语句就这么写:
select * from (select rank() over(partition by subject order by mark desc) rk,S.* from S) T
where T.rk<=3;
三种rank函数:
row_number(),有两个并列第一,只返回一个结果
rank()是跳跃排序,有两个第二名时接下来就是第四名
dense_rank()l是连续排序,有两个第二名时仍然跟着第三名
partition by的意思
就是按照某字段分组,
比如
id order
1 1
1 2
1 3
2 4
2 5
2 6
如果按id PARTITION,则可以出现
1 1
1 2
1 3
2 1
2 2
2 3