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

PostgreSQL查询:找出同一产品单日category_code不一致的数据行

解决PostgreSQL中同一product_key单日category_code不一致的查询问题

嘿,这问题我熟!要找出同一product_key在同一天对应不同category_code的数据行,我给你两种实用的PostgreSQL查询方案,按需选就行~

方法一:先筛选问题组合再关联原表

这种方法先通过分组找出存在异常的(product_key, 日期)组合,再关联原表获取完整的异常数据行,逻辑清晰易懂:

-- 替换your_table为你的实际表名
SELECT t.*
FROM your_table t
JOIN (
    SELECT 
        product_key, 
        -- 如果Date是timestamp类型,用DATE(Date)截断到日期;如果已经是date类型,直接用Date即可
        DATE(Date) AS day_date
    FROM your_table
    GROUP BY product_key, DATE(Date)
    -- 筛选出同一product_key单日有多个不同category_code的组合
    HAVING COUNT(DISTINCT category_code) > 1
) problematic 
    ON t.product_key = problematic.product_key 
    AND DATE(t.Date) = problematic.day_date
ORDER BY t.product_key, t.Date;

解释:

  • 子查询problematic负责定位所有存在异常的(product_key, 日期)对:通过GROUP BY按product_key和日期分组,用COUNT(DISTINCT category_code) > 1判断该组内是否有不同的category_code。
  • 外层查询将原表与子查询关联,拉取所有属于这些异常组合的数据行,方便你查看具体的不一致情况。

方法二:用窗口函数直接标记异常行

如果你更喜欢用窗口函数,这种写法更简洁,不需要额外的JOIN操作:

-- 替换your_table为你的实际表名
SELECT Date, product_key, category_code
FROM (
    SELECT 
        Date, 
        product_key, 
        category_code,
        -- 按product_key和日期分组,计算组内不同category_code的数量
        COUNT(DISTINCT category_code) OVER (PARTITION BY product_key, DATE(Date)) AS distinct_cat_count
    FROM your_table
) sub_query
-- 筛选出组内存在多个不同category_code的行
WHERE distinct_cat_count > 1
ORDER BY product_key, Date;

解释:

  • 内层子查询通过窗口函数COUNT(DISTINCT ...) OVER (PARTITION BY ...),给每一行标记出它所属的(product_key, 日期)组内有多少种不同的category_code。
  • 外层查询直接筛选出标记值大于1的行,就是你要找的异常数据。

注意事项

  • 如果你的Date字段是timestamp/timestamptz类型,一定要用DATE(Date)来截断到日期部分,避免因为时分秒不同导致分组错误;如果已经是date类型,直接用Date即可。
  • 记得把代码里的your_table替换成你实际使用的数据表名称。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:33:24