嗨嗨~今天介紹 SQL 中的 ROW_NUMBER()
函數,除了可產生遞增整數以外,也常搭配用來為資料分組。
ROW_NUMBER(): 為每筆資料產生 1 ~ N 的遞增整數。
搭配 OVER 函數,可根據特定的資料欄位排序與產生整數。
例如以下的語法,會根據 Score 欄位產生整數 (名次)。
SELECT ID, Score, Class, ROW_NUMBER() OVER(ORDER BY Score DESC) N'RowNumber'
FROM Students
可搭配 OVER PARTITION BY 關鍵字,根據資料欄位的分組結果產生分組的整數。
例如以下語法,是每個班級依分數高低產生整數 (名次)。
SELECT ID, Score, Class, ROW_NUMBER() OVER(PARTITION BY Class ORDER BY Score DESC) N'RowNumber'
FROM Students
範例:
-- 建立表格 (班級、學號、分數)
CREATE TABLE Students (Class VARCHAR(10), ID INT, Score INT);
INSERT INTO Students VALUES ('A', 1, 100); -- A 班
INSERT INTO Students VALUES ('A', 2, 80);
INSERT INTO Students VALUES ('A', 3, 90);
INSERT INTO Students VALUES ('B', 4, 70); -- B 班
INSERT INTO Students VALUES ('B', 5, 75);
INSERT INTO Students VALUES ('C', 6, 85); -- C 班
INSERT INTO Students VALUES ('C', 7, 91);
-- 所有班級排名
SELECT Class, ID, Score,
ROW_NUMBER() OVER(ORDER BY Score DESC) AS N'RowNumber'
FROM Students
-- 各班級排名
SELECT ID, Score, Class,
ROW_NUMBER() OVER(PARTITION BY Class ORDER BY Score DESC) N'RowNumber'
FROM Students
也有與 ROW_NUMBER()
類似的次序函數可以使用,如 RANK()
(資料值相同時賦予相同整數,會跳號)、DENSE_RANK()
(資料值相同時賦予相同整數,不跳號)
參考資料