開窗函數詳解(rank()、dense_rank()、row_number())

首先,我們新建一張表,並且往裏面插入一堆測試數據:
Create Table #Student(StudentID int, Subjects Nvarchar(10),Score int)
Insert into #Student
Select 1 ,'Chiness',90 Union all
Select 2 ,'Chiness',91 Union all
Select 3 ,'Chiness',89 Union all
Select 4 ,'Chiness',80 Union all
Select 5 ,'Chiness',95 Union all
Select 1 ,'Math',100 Union all
Select 2 ,'Math',86 Union all
Select 3 ,'Math',99 Union all
Select 4 ,'Math',80 Union all
Select 5 ,'Math',60 Union all
Select 1 ,'English',70 Union all
Select 2 ,'English',88 Union all
Select 3 ,'English',96 Union all
Select 4 ,'English',81 Union all
Select 5 ,'English',79 

下面要彙總出每門學科的學生排行信息:
Select *,rank()over(partition by subjects order by score desc) as [rank] from #Student
接着,根據這個結果,我想要查找出每門學科第一的學生:
WITH A AS(
	Select *,rank()over(partition by subjects order by score desc) as [rank] from #Student 
	)SELECT * FROM A WHERE [rank]=1
結果如下:
在這裏,要糾正一個錯誤,本來我是這麼寫的,結果報錯了:
Select *,rank()over(partition by subjects order by score desc) as [rank] from #Student 
	WHERE rank()over(partition by subjects order by score desc)=1
報錯信息是:開窗函數只能出現在 SELECT 或 ORDER BY 子句中。
這一點要注意咯~~

下面,彙總每個學生的學科排行信息:
Select *,rank()over(partition by studentid order by score desc) as [rank] from #Student


根據這個彙總信息我想要查找“數學”相對自己其他學科比較弱需要加強的都有哪些人:
WITH A AS(
	Select *,rank()over(partition by studentid order by score desc) as [rank] from #Student
	)SELECT * FROM A WHERE SUBJECTS='MATH' AND RANK=3
1

下面,我們再來彙總一下全部學生的總分排行情況::
最後,來對比一下rank()、dense_rank()、row_number()這三者之間的區別:


rank ():如圖1
dense_rank(): 如圖2
row_number():如圖3
當排序過程當中出現重複相同值的時候,這三者的區別顯而易見~~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章