首页/数据/SQL 速查/窗口函数去重:每组只留一行
本包目录(311 条)
查询基础33 条连接与子查询40 条
聚合与窗口函数54 条
函数速查60 条变更与事务52 条性能与执行计划72 条

窗口函数去重:每组只留一行

去重取最新/最早一条的通用写法:PARTITION BY 去重键 + ORDER BY 排序 + rn=1;比 GROUP BY 更容易保留整行信息。

SQL 速查数据更新于 2026-10-12

示例

示例
WITH ranked AS (
    SELECT u.*,
           ROW_NUMBER() OVER (PARTITION BY u.email
                              ORDER BY u.updated_at DESC, u.id DESC) AS rn
    FROM users u
)
SELECT id, email, updated_at
FROM ranked
WHERE rn = 1;
思路按去重键分区,按“保留优先级”排序取首行
优势输出完整行,不受聚合列限制
删除重复MySQL 可 DELETE 连子查询句柄删除多余行

易错点

  • 去重规则(按邮箱还是按手机号)要先与业务确认,否则删错数据难恢复
  • 大批量删除重复行时先 SELECT 出待删 id 清单核对,再分批 DELETE

数据来源与参考

  • MySQL 8.0 Reference Manual · Window Functions
  • PostgreSQL Documentation · Window Functions
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌