PostgreSQL的DISTINCT ON是一种特殊的语法,用于根据指定列去重,同时返回其他列的值。与标准SQL的DISTINCT不同,DISTINCT ON允许在去重时保留每组重复值中的第一行(或其他排序后的行)。

 SELECT DISTINCT ON (CREATED_NAME) CREATED_NAME, CRATED_DATE
 FROM EMP
 WHERE CREATED_TYPE = 'A'
 ORDER BY CREATED_NAME, CRATED_DATE

PostgerSQL中DISTINCT ON (列名)中,已经隐含了按列名分组,并且ORDER BY 列名 是不能缺少的,代表对于每个CREATED_NAME,只返回第一条记录(根据ORDER BY 排序的第一条)

ORDER BY子句必须包含DISTINCT ON的所有表达式,且这些表达式必须作为排序的最左侧字段。例如:

-- 正确写法
SELECT DISTINCT ON (a, b) a, b, c FROM table ORDER BY a, b, c;

-- 错误写法(缺少b的排序)
SELECT DISTINCT ON (a, b) a, b, c FROM table ORDER BY a, c;
 

与GROUP BY的区别

DISTINCT ONGROUP BY都能实现去重,但:

  • GROUP BY会对结果集进行聚合计算
  • DISTINCT ON只是简单地选择每组的第一行,保留原始数据
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐