PostgreSQL多列重复筛选查询需求:仅保留Custom类型重复记录
解决PostgreSQL中按指定列重复筛选记录的问题
没问题,我来帮你实现这个需求。咱们可以借助PostgreSQL的窗口函数来精准筛选符合条件的记录,思路很清晰:先标记出哪些记录属于重复的(Product、Component、Detail三列组合相同)分组,然后对重复组只保留No_Type='Custom'的记录,非重复组则直接保留原记录。
完整SQL语句
WITH grouped_records AS ( SELECT Product, Component, Detail, Stock, No_Type, -- 统计当前组合的总记录数,判断是否重复 COUNT(*) OVER (PARTITION BY Product, Component, Detail) AS group_record_count, -- 标记当前组是否存在Custom类型的记录(让逻辑更严谨) BOOL_OR(No_Type = 'Custom') OVER (PARTITION BY Product, Component, Detail) AS has_custom_type FROM your_table_name -- 这里替换成你的实际表名 ) SELECT Product, Component, Detail, Stock, No_Type FROM grouped_records WHERE -- 非重复组直接保留 group_record_count = 1 -- 重复组只保留Custom类型的记录 OR (group_record_count > 1 AND No_Type = 'Custom');
代码解释
CTE
grouped_records:COUNT(*) OVER (PARTITION BY ...):按Product、Component、Detail分组,计算每组的总记录数,用来判断该组合是否重复。BOOL_OR(...) OVER (...):检查当前分组里是否存在No_Type='Custom'的记录,这个是为了让逻辑更严谨(比如如果某个重复组没有Custom记录,就会全部排除,当然你的示例里不存在这种情况)。
最终筛选条件:
- 当
group_record_count=1时,说明这个组合没有重复,直接保留这条记录; - 当
group_record_count>1(重复组)时,只筛选出No_Type='Custom'的记录。
- 当
验证示例数据
把你的示例表代入这个语句后,会得到你期望的结果:
- Brick相关的三个重复组合,都会只保留
Custom类型的记录; - Box相关的两个非重复组合,会原样保留
General类型的记录。
内容的提问来源于stack exchange,提问作者ma0608
相关产品推荐
相关产品推荐

