如何通过SQL关联查询获取多记录日期区间内的年度季度?
批量获取每条记录对应的区间内季度
表结构与需求回顾
- QuarterIssue表(业务数据):
| id | Acq_Date | Dis_Date |
|---|---|---|
| 1 | 2015-08-07 | 2016-12-31 |
| 2 | 2018-01-05 | 2022-12-31 |
| 3 | 2019-06-21 | 2022-12-31 |
- QuarterYear表(季度主表):存储所有年度+季度的组合,示例包含2014-2016年的季度。
需求:为QuarterIssue中的每条id,找出其Acq_Date到Dis_Date之间的所有年度和季度组合。
问题分析
你原来的SQL用top 1只取了第一条记录的时间区间,只能处理单条数据。要批量搞定所有id,得把业务表和季度主表做关联,让每条业务记录都匹配自己对应的季度区间。
解决方案SQL
SELECT QI.id, QY.[YEAR], QY.[Quarter], (QY.[YEAR] + CAST(QY.[Quarter] AS DECIMAL)/10) AS QuarterValue FROM QuarterIssue QI CROSS JOIN QuarterYear QY WHERE -- 用数值化方式对比季度区间,和你原来的逻辑一致 (QY.[YEAR] + CAST(QY.[Quarter] AS DECIMAL)/10) BETWEEN (YEAR(QI.Acq_Date) + CAST(DATEPART(qq, QI.Acq_Date) AS DECIMAL)/10) AND (YEAR(QI.Dis_Date) + CAST(DATEPART(qq, QI.Dis_Date) AS DECIMAL)/10) ORDER BY QI.id, QY.[YEAR], QY.[Quarter];
说明
- 用
CROSS JOIN先把每条业务记录和所有季度做全关联,再通过WHERE条件筛出当前业务记录时间范围内的季度,这样就能批量处理所有id了。 - 保留了你原来用的「年度+季度/10」的数值比较方式(比如2015年第3季度就是2015.3),这种方式能准确判断季度的先后顺序。
- 最后加了排序,让每个id对应的季度按时间顺序排列,看起来更清楚。
如果QuarterYear表数据量很大,也可以用INNER JOIN替代CROSS JOIN,逻辑完全一致,因为WHERE条件会自动过滤掉不符合的组合。
内容的提问来源于stack exchange,提问作者user1890098
相关产品推荐
相关产品推荐

