PostgreSQL中两条count(distinct buyer)查询结果不一致,求原因
结果差异的核心原因
两条查询的统计范围完全不同,结果自然不一致:
- 第一条查询的逻辑:
先对全表做行级过滤,仅保留purchase_date落在近220天范围内的行,再统计这些行里的去重buyer数量,最终得到的是近220天产生过购买行为的用户总数,也就是你拿到的11449。 - 第二条查询的逻辑:
CTE内部没有做任何前置过滤,是对全表所有的buyer做分组聚合,哪怕某个buyer最近一次购买是在220天之前,也会出现在CTE的结果集中,只是他对应的day220字段值为0而已。你最终统计的是CTE中所有的去重buyer,也就是全表所有历史有过购买记录的用户总数,自然远大于第一条的结果,也就是你拿到的20507。
修正方案
如果要让第二条查询和第一条结果对齐,任选一种修改方式即可:
- 在CTE的聚合后加过滤条件:最终查询改为
select count(distinct(buyer)) from cte where day220 > 0,仅统计近220天有订单的用户 - 在CTE的表扫描阶段加过滤条件:在
FROM tablename后面加上和第一条完全一致的where条件where date(purchase_date) >= (cast(current_date as date) - interval '220' day),先过滤再聚合
另外补充冗余代码提示:你CTE里写的distinct(buyer)是完全多余的,因为已经加了group by buyer,每个buyer天然只会返回一行,不需要额外去重。
内容的提问来源于stack exchange,提问作者pouchewar
相关产品推荐
相关产品推荐

