回覆列表
-
1 # 使用者64126879034
-
2 # 滴逃逃
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
dense_rank與rank()用法相當,但是有一個區別:dence_rank在處理相同的等級時,等級的數值不會跳過。rank則跳過。
例如:表
A B C
a liu wang
a jin shu
a cai kai
b yang du
b lin ying
b yao cai
b yang 99
例如:當rank時為:
select m.a,m.b,m.c,rank() over(partition by a order by b) liu from test3 m
A B C LIU
a cai kai 1
a jin shu 2
a liu wang 3
b lin ying 1
b yang du 2
b yang 99 2
b yao cai 4
而如果用dense_rank時為:
select m.a,m.b,m.c,dense_rank() over(partition by a order by b) liu from test3 m
A B C LIU
a cai kai 1
a jin shu 2
a liu wang 3
b lin ying 1
b yang du 2
b yang 99 2
b yao cai 3
rank是oracle分析函式中的一個,主要用法是rank()over(partiton by XX orader by ZZ desc)(分組排序序號)一般用來分組排序,與group by XX order by ZZ 不同的是,它並不影響現有資料。比如:xx zz1 21 31 42 22 6那麼select xx,zz,rank()over(partiton by XX orader by ZZ ) aa from table的結果為xx zz aa1 2 11 3 21 4 32 2 12 6 2partition by可不寫,這樣就是全域性排序,與order by的排序結果相同,只是會存在序號還有其他用法,而且還有很多分析函式,這個可以上網找找,oracle分析函式,裡面的例子好多,希望對你有幫助。