PostgreSQL中如何追踪GROUP BY分组涉及的源行并定位重复记录
SQL查询重复分组明细操作方案
针对你需要获取Date、Condition重复分组下全部明细行的需求,提供两种可直接使用的实现方案:
- 方案1:分组筛选后关联原表(新手友好,逻辑直观)
先通过分组聚合筛选出存在重复的分组,再关联原表获取该分组下的所有记录,SQL语句如下:SELECT t1.* FROM test_table t1 INNER JOIN ( -- 子查询:找出所有记录数大于1的重复分组 SELECT Date, Condition FROM test_table GROUP BY Date, Condition HAVING COUNT(*) > 1 ) t2 ON t1.Date = t2.Date AND t1.Condition = t2.Condition ORDER BY t1.Date, t1.Condition - 方案2:窗口函数实现(代码更简洁,支持同时输出聚合指标)
利用窗口函数直接给每行计算所属分组的记录数,再筛选出属于重复分组的行即可:SELECT * FROM ( SELECT *, -- 统计每行所属Date+Condition分组的总记录数 COUNT(*) OVER(PARTITION BY Date, Condition) AS group_total FROM test_table ) temp WHERE group_total > 1 ORDER BY Date, Condition
如果你需要同时查看每个重复分组的聚合结果(比如最大值、平均值),可以直接在窗口函数中新增对应的计算逻辑,无需额外关联:
SELECT * FROM ( SELECT *, COUNT(*) OVER(PARTITION BY Date, Condition) AS group_total, MAX(Value) OVER(PARTITION BY Date, Condition) AS group_max_value, AVG(Value) OVER(PARTITION BY Date, Condition) AS group_avg_value FROM test_table ) temp WHERE group_total > 1
性能提示
针对100万行量级的表,只要你在Date和Condition字段上建立了联合索引,以上两种方案的执行效率都可以得到保障,无需担心查询超时问题。
内容的提问来源于stack exchange,提问作者Helene
相关产品推荐
相关产品推荐

