【SQL Server】分區函數 partition by


group by是分組函數,partition by是分區函數,sum()等是聚合函數

函數寫法

over(partition by Course order by Score)

說明:先對Course列中相同的數據進行分區,在Course中相同的情況下對Score進行排序

rank()與row_number()與dense_rank()對比

例:查詢每名課程的第一名的成績

1. rank():如果兩個或多個行與一個排名關聯,則每個關聯行將得到相同的排名。例如,有兩位同學具有相同的Score值,則他們將並列排名。由於已有兩行排名在前,所以具有下一個最大Score的同學將排名第三。因此,RANK 函數並不總返回連續整數。

select rank() over(partition by Course order by Score desc), * 
from dbo.UserGrade

2. row_number():返回結果集分區內行的序列號,每個分區的第一行從 1 開始。ORDER BY 子句可確定在特定分區中為行分配唯一 ROW_NUMBER 的順序。

select row_number() over(partition by Course order by Score desc), * 
from dbo.UserGrade

3. dense_rank():如果有兩個或多個行受同一個分區中排名的約束,則每個約束行將接收相同的排名。例如,有兩位同學具有相同的Score值,則他們將並列排名。接下來 Score最高的同學排名第二。該排名等於該行之前的所有行數加一。因此,DENSE_RANK 函數返回的數字沒有間斷,並且始終具有連續的排名。整個查詢所用的排序順序確定了各行在結果中的顯示順序。這說明排名第一的行可以不是分區中的第一行。

select dense_rank() over(partition by Course order by Score desc), * 
from dbo.UserGrade

創建測試數據

create table UserGrade (
  ID int,
  Name varchar(50),
  Course varchar(50),
  Score int
)
go
insert into
  dbo.UserGrade (ID, Name, Course, Score)
values
  (1000, '張三', '語文', 80),(1001, '李四', '英語', 100),(1002, '張三', '數學', 90),(1003, '王五', '英語', 50),(1004, '李四', '數學', 60),(1005, '李四', '語文', 80),(1006, '王五', '語文', 50),(1007, '王五', '數學', 30),(1008, '張三', '英語', 60)
View Code

原文鏈接:https://blog.csdn.net/weixin_44547599/article/details/88764558

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM