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

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');

代码解释

  1. CTE grouped_records:

    • COUNT(*) OVER (PARTITION BY ...):按Product、Component、Detail分组,计算每组的总记录数,用来判断该组合是否重复。
    • BOOL_OR(...) OVER (...):检查当前分组里是否存在No_Type='Custom'的记录,这个是为了让逻辑更严谨(比如如果某个重复组没有Custom记录,就会全部排除,当然你的示例里不存在这种情况)。
  2. 最终筛选条件:

    • 当group_record_count=1时,说明这个组合没有重复,直接保留这条记录;
    • 当group_record_count>1(重复组)时,只筛选出No_Type='Custom'的记录。

验证示例数据

把你的示例表代入这个语句后,会得到你期望的结果:

  • Brick相关的三个重复组合,都会只保留Custom类型的记录;
  • Box相关的两个非重复组合,会原样保留General类型的记录。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:40:13