SQL Server中ROW_NUMBER()函式的使用
ROW_NUMBER()返回結果集分割槽內行的序列號,每個分割槽的第一行從1開始。
先建立學生成績表和班級資訊表並插入測試資料,用於以下例項的使用。
/*-建立學生成績表-*/
CREATE TABLE StuScore
(
StuID INT, --學生編號
StuName VARCHAR(20), --學生姓名
ClassID INT, --班級編號
Subject VARCHAR(20), --科目
Score INT --成績
);
/*-建立班級資訊表-*/
CREATE TABLE ClassInfo
(
ClassID INT, --班級編號
ClassName VARCHAR(20), --班級名稱
);
/*-新增學生成績資訊-*/
INSERT INTO StuScore VALUES(1,'張三',1,'語文',60);
INSERT INTO StuScore VALUES(1,'張三',1,'數學',90);
INSERT INTO StuScore VALUES(1,'張三',1,'英語',70);
INSERT INTO StuScore VALUES(2,'李四',2,'語文',100);
INSERT INTO StuScore VALUES(2,'李四',2,'數學',90);
INSERT INTO StuScore VALUES(3,'王五',2,'語文',80);
/*-新增班級資訊-*/
INSERT INTO ClassInfo VALUES(1,'高一(1)班');
INSERT INTO ClassInfo VALUES(2,'高二(3)班');
1、ROW_NUMBER() OVER(ORDER BY)
ROW_NUMBER() OVER(ORDER BY 欄位1 DESC)是先把欄位1降序,再為降序以後的每條記錄返回一個序號。
【例項】使用ROW_NUMBER() OVER(ORDER BY)按學生成績排序,併為每條排序後的記錄返回一個序號。
SELECT ROW_NUMBER() OVER(ORDER BY Score DESC) AS Row_Index,*
FROM StuScore
執行結果:
Row_Index StuID StuName ClassID Subject Score
-------------------- ----------- -------------------- ----------- -------------------- -----------
1 2 李四 2 語文 100
2 2 李四 2 數學 90
3 1 張三 1 數學 90
4 3 王五 2 語文 80
5 1 張三 1 英語 70
6 1 張三 1 語文 60
2、ROW_NUMBER() OVER(PARTITION BY)
ROW_NUMBER() OVER(PARTITION BY 欄位1 ORDER BY 欄位2 DESC)表示根據欄位1分組,在分組內部根據欄位2排序,而此函式計算的值就表示每組內部排序後的順序編號(組內連續的唯一的)。
【例項】使用ROW_NUMBER() OVER(PARTITION BY)按學生編號分組且按學生成績排序,再為每條排序後的記錄返回一個序號。
SELECT ROW_NUMBER() OVER(PARTITION BY StuID ORDER BY Score DESC) AS Row_Index,*
FROM StuScore
執行結果:
Row_Index StuID StuName ClassID Subject Score
-------------------- ----------- -------------------- ----------- -------------------- -----------
1 1 張三 1 數學 90
2 1 張三 1 英語 70
3 1 張三 1 語文 60
1 2 李四 2 語文 100
2 2 李四 2 數學 90
1 3 王五 2 語文 80
【例項】查詢每個學生最高的成績。
SELECT t.* FROM(
SELECT ROW_NUMBER() OVER(PARTITION BY StuID ORDER BY Score DESC) AS Row_Index,*
FROM StuScore
) t WHERE t.Row_Index = 1
執行結果:
Row_Index StuID StuName ClassID Subject Score
-------------------- ----------- -------------------- ----------- -------------------- -----------
1 1 張三 1 數學 90
1 2 李四 2 語文 100
1 3 王五 2 語文 80
【例項】查詢每個學生最高的成績,並關聯班級名稱。
SELECT t1.StuID,t1.StuName,t1.Subject,t1.Score,t2.ClassName FROM(
SELECT tt.* FROM(
SELECT ROW_NUMBER() OVER(PARTITION BY StuID ORDER BY Score DESC) AS Row_Index,*
FROM StuScore
) tt WHERE tt.Row_Index = 1) t1
LEFT JOIN ClassInfo t2 ON t1.ClassID = t2.ClassID
執行結果:
StuID StuName Subject Score ClassName
----------- -------------------- -------------------- ----------- --------------------
1 張三 數學 90 高一(1)班
2 李四 語文 100 高二(3)班
3 王五 語文 80 高二(3)班
---------------------
作者:pan_junbiao
來源:CSDN
原文:https://blog.csdn.net/pan_junbiao/article/details/79941162
版權宣告:本文為博主原創文章,轉載請附上博文連結!