資料表 scan 記錄科目(km)、考生(kh)、成績(cj)。需依科目與考生分組,取各組成績前 2 高的記錄。
CREATE TABLE [dbo].[scan] (
[km] [int] NULL, -- 科目號
[kh] [int] NULL, -- 考生號
[cj] [int] NULL -- 成績
) ON [PRIMARY];
核心邏輯:PARTITION BY 分組,ORDER BY 排序產生序號,外層篩選序號 ≤ N。
SELECT * FROM (
SELECT a.km, a.kh, cj,
ROW_NUMBER() OVER (PARTITION BY a.km ORDER BY a.km, a.cj DESC) AS n
FROM (
SELECT km, kh, SUM(cj) AS cj
FROM scan
GROUP BY km, kh
) a
) b
WHERE n <= 2
ORDER BY km, cj DESC;
PARTITION BY a.km:依科目分組ORDER BY a.cj DESC:組內按成績降序ROW_NUMBER():為每組記錄產生 1,2,3... 序號WHERE n <= 2 取前 2 筆(圖片展示查詢結果:每個 km 下,各 kh 最高的兩筆 cj 記錄)

n <= 2 改為 n <= NPARTITION BY km, khRANK() 或 DENSE_RANK() 處理並列名次