order by就只是個排序,比如:select 學生姓名,科目,分數 from 成績表 order by 分數 desc。
但是,當學生非常多時,order by只看出學生的大致成績分佈,不能看出具體的名次。如果要知道名次,就得rank配合上場了,如:select 學生姓名,科目,分數,rank() over(order by 分數 desc ) as 名次 from 成績表 。用這個排序有個好處,如果有並列名次的,後面的名次會自動累積增加。比如有三個並列第2的,再下一個名次就是5。如果不想名次累積增加,就寫成:select 學生姓名,科目 ,分數,dense_rank() over(order by 分數 desc ) as 名次 from 成績表。這樣在三個並列第2之後,名次仍然是第3。
以上方式是拉通排名次的,不管語文數學還是英語,都由高到低排名次。
rank還可以分割槽域查詢,也就是說如果我們想各個科目分別排序,可以這麼寫:select 學生姓名,科目,分數,rank() over(partition by 科目 order by 分數 desc ) as 名次 from 成績表。
rank,order by 看上去都是排序,但rank的功能簡直不要太靈活太強大。
order by就只是個排序,比如:select 學生姓名,科目,分數 from 成績表 order by 分數 desc。
但是,當學生非常多時,order by只看出學生的大致成績分佈,不能看出具體的名次。如果要知道名次,就得rank配合上場了,如:select 學生姓名,科目,分數,rank() over(order by 分數 desc ) as 名次 from 成績表 。用這個排序有個好處,如果有並列名次的,後面的名次會自動累積增加。比如有三個並列第2的,再下一個名次就是5。如果不想名次累積增加,就寫成:select 學生姓名,科目 ,分數,dense_rank() over(order by 分數 desc ) as 名次 from 成績表。這樣在三個並列第2之後,名次仍然是第3。
以上方式是拉通排名次的,不管語文數學還是英語,都由高到低排名次。
rank還可以分割槽域查詢,也就是說如果我們想各個科目分別排序,可以這麼寫:select 學生姓名,科目,分數,rank() over(partition by 科目 order by 分數 desc ) as 名次 from 成績表。