SQL分指定日期范围汇总用户金额 筛选单范围总额达阈值的UserID
原SQL的核心缺陷
当前写法存在两个直接导致结果偏差的问题:
- 分组维度仅设置为
UserID,数据库会把两个目标统计区间的所有匹配数据统一拉通计算总和,完全丢失“单区间独立汇总”的统计边界,极易出现跨区间累加凑够100就误判达标的问题 - 没有给每笔原始数据绑定所属的统计区间标签,最终输出自然无法标注结果对应的日期范围
可落地的实现方案
通过「先给原始数据打所属区间标签、再按“用户+区间”双维度分组」的思路,就能严格实现单区间独立统计的要求,兼容绝大多数SQL数据库的通用写法如下:
SELECT UserID, SUM(Amount) AS `Total Amount`, `Date Range` FROM ( -- 逐行标记每笔记录所属的目标统计范围 SELECT UserID, Amount, CASE WHEN `Date` BETWEEN '01/01/2021' AND '01/31/2021' THEN 'January' WHEN `Date` BETWEEN '02/01/2021' AND '02/28/2021' THEN 'February' ELSE NULL -- 不在目标统计范围内的记录直接打空标签 END AS `Date Range` FROM `table` ) AS marked_source -- 过滤掉不属于目标统计范围的记录 WHERE `Date Range` IS NOT NULL -- 以用户+所属区间为粒度分组,从根源上避免跨区间累加 GROUP BY UserID, `Date Range` -- 仅保留单区间内累计金额≥100的记录 HAVING SUM(Amount) >= 100
结果匹配校验
用给定的测试数据运行上述SQL,输出结果会完全匹配预期:
- UserID 123:January区间内累计金额为50+60=110,满足≥100的阈值,会输出对应记录
- UserID 234:February区间内累计金额为105,满足阈值,会输出对应记录
- UserID 345:January区间累计70、February区间累计50,单区间均未达到100的阈值,不会出现在结果中
- UserID 456:交易记录在2020年12月,不属于目标统计范围,会被直接过滤
如果后续需要扩展更多统计区间,只需要在内层的CASE WHEN语句中补充对应区间的匹配规则和展示标签即可,不需要调整整体的分组逻辑。
内容的提问来源于stack exchange,提问作者Bryan Tran
相关产品推荐
相关产品推荐

