【问题标题】:Why doesn't my DISTINCT ON expression work?为什么我的 DISTINCT ON 表达式不起作用?
【发布时间】:2025-12-05 05:40:01
【问题描述】:

查询:

SELECT DISTINCT ON (geom_line),gid 
FROM edge_table;

我有一个包含重复项的边表,我想删除重复的边保留其中一个,但语法本身是错误的?

【问题讨论】:

标签: sql postgresql distinct-on


【解决方案1】:

逗号是问题。

如果您希望geom_line 包含在结果中,请使用

SELECT DISTINCT ON (geom_line) geom_line, gid FROM edge_table;

其他用途

SELECT DISTINCT ON (geom_line) gid FROM edge_table;

但如果您的目标只是删除重复项,我会说您应该使用

SELECT DISTINCT geom_line, gid FROM edge_table;

DISTINCT 保证整个结果集的唯一性,而DISTINCT ON 保证括号中表达式的唯一性。如果有几行括号中的表达式相同,则选择其中一行。如果您有 ORDER BY 子句,则会选择第一行。

DISTINCT a, bDISTINCT ON (a, b) a, b 相同。

【讨论】:

  • distinct on 和 distinct 的基本区别是什么?
  • 我已经扩展了答案来解释这一点。
最近更新 更多