SQL INNER JOIN带日期过滤的分组聚合查询问题咨询
SQL问题解答
现有表结构与示例数据
- Table1
ID Date 1 2022-01-01 2 2022-02-01 3 2022-02-05
- Table2
ID Date Amount 1 2021-08-01 15 1 2022-02-10 15 2 2022-02-15 20 2 2021-01-01 15 2 2022-02-20 20 1 2022-03-01 15
需求目标
筛选Table2中日期晚于Table1同ID对应Date的记录,按ID分组,计算每个分组的Amount总和、分组内的最大日期,预期输出结果如下:
ID Date Amount 1 2022-03-01 30 2 2022-02-20 40
问题原因
你之前写的查询仅完成了两表ID的关联,缺少两个核心逻辑:
- 没有添加日期过滤条件,无法排除Table2中日期早于同ID下Table1日期的记录
- 没有做分组聚合计算,无法得到求和、取最大日期的结果
另外你写的两层CTE没有做任何额外数据处理,属于冗余写法,可以直接省略。
正确SQL代码
SELECT b.ID, MAX(b.Date) AS Date, SUM(b.Amount) AS Amount FROM Table1 a INNER JOIN Table2 b ON a.ID = b.ID AND b.Date > a.Date GROUP BY b.ID;
执行逻辑说明
- 两表关联时同时匹配两个条件:ID相等、Table2的日期严格大于Table1同ID的日期,关联阶段就会自动过滤掉不符合时间要求的记录
- 关联过滤完成后,按ID分组,用
MAX()函数取分组内最晚日期,SUM()函数计算分组内符合条件的金额总和,即可得到预期结果 - ID=3在Table2中无匹配记录,INNER JOIN会自动过滤,不会出现在最终结果中
内容的提问来源于stack exchange,提问作者FlyingPickle
相关产品推荐
相关产品推荐

