表 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;
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 自連接 |