You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL使用DISTINCT ON仍有重复结果,如何获取唯一行?

解决PostgreSQL中DISTINCT ON未去重及筛选特定行的问题

为什么DISTINCT ON没达到你要的去重效果?

DISTINCT ON是按你指定的列组合保留唯一行的。如果只指定id或serial_no其中一列,另一列重复的行仍会被保留;就算指定了(id, serial_no),若查询结果包含其他不同字段(比如时间戳、备注),PostgreSQL会判定两行不同,不会去重——但你关注的id和序列号看起来重复。

筛选id与序列号均不重复的两行的方案

方案1:直接筛选符合条件的行对

如果需要任意一组满足“id互异、序列号互异”的两行(比如你说的第1+4行,或第2+3行),可以用自连接实现:

-- 假设表名为your_table,主键为row_id(避免重复行对)
SELECT t1.*
FROM your_table t1
JOIN your_table t2 
  ON t1.id != t2.id 
  AND t1.serial_no != t2.serial_no
  AND t1.row_id < t2.row_id -- 确保每组行对只取一次
LIMIT 2;

方案2:先过滤无重复行再取结果

如果要先找出所有自身id和序列号都无重复的行,再从中取两行:

WITH filtered_rows AS (
    SELECT *,
           COUNT(*) OVER (PARTITION BY id) AS id_occurrences,
           COUNT(*) OVER (PARTITION BY serial_no) AS serial_occurrences
    FROM your_table
)
SELECT id, serial_no -- 替换成你需要的其他列
FROM filtered_rows
WHERE id_occurrences = 1 AND serial_occurrences = 1
LIMIT 2;

补充:修正DISTINCT ON的用法

如果目标是让id+序列号的组合唯一,直接把两个列都放进DISTINCT ON:

SELECT DISTINCT ON(id, serial_no)
       id, serial_no, -- 其他列
FROM your_table
ORDER BY id, serial_no; -- 可指定保留每组的哪一行

内容的提问来源于stack exchange,提问作者Anti Mafia

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 20:40:05