學生成績表,需查詢「每科成績前 3 名」。
CREATE TABLE #Score (Name VARCHAR(20), Subject VARCHAR(20), Score INT);
INSERT INTO #Score VALUES
('張三','語文',98),('張三','數學',80),('張三','英語',90),
('李四','語文',88),('李四','數學',86),('李四','英語',88),
('李明','語文',60),('李明','數學',86),('李明','英語',88),
('林風','語文',74),('林風','數學',99),('林風','英語',59),
('嚴明','英語',96);
SELECT Subject, Name, Score
FROM (
SELECT Subject, Name, Score,
ROW_NUMBER() OVER (PARTITION BY Subject ORDER BY Score DESC) AS rn
FROM #Score
) t
WHERE rn <= 3
ORDER BY Subject, rn;
ROW_NUMBER() OVER (PARTITION BY <分組欄位> ORDER BY <排序欄位>)
PARTITION BY Subject:依科目分組。ORDER BY Score DESC:組內按分數遞減排序。DROP TABLE #Score;
RANK() 或 DENSE_RANK() 處理並列名次。