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

PostgreSQL使用含>=<=多条件的JOIN统计用户发信前7天购礼数量

SQL问题修正方案

问题根因

你原有SQL的核心错误是使用了count(*)统计行数:
LEFT JOIN未匹配到B表购礼记录时,返回行的B表字段全为NULL,但count(*)统计的是结果集的总行数,哪怕B字段全空的行也会被计数为1,因此coalesce(count(*), 0)永远不会返回0,和需求要求无购礼记录返回0的规则冲突。

另外你将时间过滤条件写在LEFT JOIN的ON子句中的逻辑是正确的,若误写在WHERE子句中会过滤掉无匹配购礼记录的行,反而会导致结果遗漏。

修正后的SQL

只需要将count(*)替换为对B表非空字段的计数即可,count(字段)会自动忽略NULL值,无匹配时自然返回0:

SELECT 
  A.user_id, 
  A.time, 
  COUNT(B.user_id) AS count
FROM A
LEFT JOIN B 
  ON A.user_id = B.user_id 
  AND B.time >= A.time - INTERVAL '7 days' 
  AND B.time < A.time
GROUP BY 1, 2

如果使用的是MySQL类数据库,间隔语法需要调整为INTERVAL 7 DAY,其余逻辑不变。

结果验证

以上SQL执行后输出结果和你给出的期望输出完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 13:48:04