首页/数据/SQL 速查/多列去重与 PostgreSQL DISTINCT ON
本包目录(311 条)

多列去重与 PostgreSQL DISTINCT ON

多列 DISTINCT 按组合去重;PostgreSQL 的 DISTINCT ON 能实现“每组保留一行”,MySQL 需要用窗口函数改写。

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

示例

示例
-- 组合去重
SELECT DISTINCT city, status FROM users;

-- PostgreSQL:每个 city 取 name 排序后的一行
SELECT DISTINCT ON (city) city, name
FROM users
ORDER BY city, name;

MySQL 等价改写

MySQL 等价改写
SELECT city, name
FROM (
  SELECT city, name,
         ROW_NUMBER() OVER (PARTITION BY city ORDER BY name) AS rn
  FROM users
) t
WHERE rn = 1;
多列 DISTINCT去重的是列的组合,任一列不同即视为不同行
DISTINCT ONPostgreSQL 专有;用 ORDER BY 决定每组保留哪一行

易错点

  • DISTINCT ON 的表达式必须与 ORDER BY 最左前缀一致,否则报错
  • “每组取最新一行”不要用 GROUP BY 加裸列:ONLY_FULL_GROUP_BY 下报错,且取到的行不确定

数据来源与参考

  • MySQL 8.0 Reference Manual · DISTINCT
  • PostgreSQL Documentation · DISTINCT Clause
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌