1. 程式人生 > >SQL Server中ROW_NUMBER()函式的使用

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 
版權宣告:本文為博主原創文章,轉載請附上博文連結!