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
相关产品推荐
相关产品推荐

