如何使用SQL从两张表中获取每个ID对应起始日期前3个月的数据
按ID匹配并获取指定日期区间的Amount数据
需要实现的逻辑是:针对每个ID,以Table A中该ID对应的Start_Date为基准,提取Table B中同ID且Start_Date在该基准日期前3个月内的Amount数据。
表结构及示例数据
Table A
| ID | Start_Date |
|---|---|
| 1 | 2022-08-01 |
Table B
| ID | Start_Date | Amount |
|---|---|---|
| 1 | 2022-08-01 | 1000 |
| 1 | 2022-07-01 | 2000 |
| 1 | 2022-06-01 | 3000 |
| 1 | 2022-05-01 | 500 |
现有SQL的局限性
你提供的以下SQL仅能基于当前日期筛选Table A的数据,无法满足按每个ID对应的基准日期匹配Table B数据的需求:
SELECT * FROM TableA WHERE Start_Date >= DATEADD(M, -3, GETDATE())
正确SQL实现方案
通过ID关联两张表,再根据Table A的Start_Date设定Table B的日期筛选范围,以SQL Server为例,具体语句如下:
SELECT a.ID, a.Start_Date AS Base_Date, b.Start_Date AS B_Date, b.Amount FROM TableA a JOIN TableB b ON a.ID = b.ID WHERE b.Start_Date >= DATEADD(MONTH, -3, a.Start_Date) AND b.Start_Date <= a.Start_Date;
逻辑说明
- 用
JOIN通过ID关联两张表,确保只匹配同ID的数据 DATEADD(MONTH, -3, a.Start_Date)计算出基准日期往前推3个月的日期- 筛选条件限定Table B的Start_Date在这个计算出的日期和基准日期之间,确保获取的是前3个月内的数据
针对示例数据,执行该SQL会得到以下结果:
| ID | Base_Date | B_Date | Amount |
|---|---|---|---|
| 1 | 2022-08-01 | 2022-08-01 | 1000 |
| 1 | 2022-08-01 | 2022-07-01 | 2000 |
| 1 | 2022-08-01 | 2022-06-01 | 3000 |
(注:2022-05-01距离2022-08-01超过3个月,因此不会被包含)
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

