首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

SQL 去重保留最新:GROUP BY + MAX 高效寫法

     編輯:程式設計綜合問答

需求

表 test,列 A 可能重複,需按 A 分組,保留 B (時間) 最大的一行。

標準寫法

SELECT A, MAX(B) AS LatestTime
FROM test
GROUP BY A
HAVING COUNT(*) > 1;  -- 僅輸出有重複的組

需保留其他列

若需保留整行(如 C, D),用窗口函數:

WITH Ranked AS (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY A ORDER BY B DESC) AS rn
    FROM test
)
SELECT A, B, C, D
FROM Ranked
WHERE rn = 1;

MySQL 8.0- / 不支持窗口函數

SELECT t1.*
FROM test t1
JOIN (
    SELECT A, MAX(B) AS maxB
    FROM test
    GROUP BY A
) t2 ON t1.A = t2.A AND t1.B = t2.maxB;

性能優化

  • 為 (A, B) 建立聯合索引:CREATE INDEX idx_a_b ON test(A, B);。
  • 大表分批處理:WHERE A BETWEEN ? AND ? 分頁去重。
  • 刪除重複保留一條:
    DELETE t1 FROM test t1
    JOIN test t2 ON t1.A = t2.A AND t1.B < t2.B;

適用場景對比

場景推薦寫法
僅需聚合列GROUP BY + MAX
需完整行、支持窗口函數ROW_NUMBER()
MySQL 老版本自連接子查詢
物理刪除重複DELETE 自連接
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved