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

PostgreSQL中两条count(distinct buyer)查询结果不一致,求原因

结果差异的核心原因

两条查询的统计范围完全不同,结果自然不一致:

  • 第一条查询的逻辑:
    先对全表做行级过滤,仅保留purchase_date落在近220天范围内的行,再统计这些行里的去重buyer数量,最终得到的是近220天产生过购买行为的用户总数,也就是你拿到的11449。
  • 第二条查询的逻辑:
    CTE内部没有做任何前置过滤,是对全表所有的buyer做分组聚合,哪怕某个buyer最近一次购买是在220天之前,也会出现在CTE的结果集中,只是他对应的day220字段值为0而已。你最终统计的是CTE中所有的去重buyer,也就是全表所有历史有过购买记录的用户总数,自然远大于第一条的结果,也就是你拿到的20507。
修正方案

如果要让第二条查询和第一条结果对齐,任选一种修改方式即可:

  1. 在CTE的聚合后加过滤条件:最终查询改为select count(distinct(buyer)) from cte where day220 > 0,仅统计近220天有订单的用户
  2. 在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 11:18:02