首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL 分組排序去重實戰:使用 ROW_NUMBER() 保留每組最新一筆

     編輯:關於SqlServer

應用場景

資料表 Eng24VIPCourseIntention 中,同一 userid 與 classid 可能有多筆記錄(不同 addtime),需保留每組最新的一筆(addtime 最大)。

核心語法

SELECT *
FROM (
    SELECT
        userid,
        classid,
        remark,
        ROW_NUMBER() OVER (
            PARTITION BY userid, classid
            ORDER BY addtime DESC
        ) AS row_bank
    FROM Eng24VIPCourseIntention
) AS ta
WHERE row_bank = 1;

關鍵點解析

  • PARTITION BY userid, classid:依此兩欄分組,每組內部編號從 1 開始。
  • ORDER BY addtime DESC:組內按時間遞減排序,最新記錄獲得 row_number = 1。
  • 外層 WHERE row_bank = 1 過濾,僅保留各組第一筆。

效能提示

  • 確保 (userid, classid, addtime) 有適當索引,避免全表掃描與排序溢出。
  • 若資料量極大,可考慮改用 CROSS APPLY 或 TOP 1 WITH TIES 寫法比較執行計畫。

此模式適用於「取各群組最新/最舊/最大/最小」等常見去重需求,語法簡潔且符合 ANSI SQL 標準。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved