我正在使用DB2 SQL,其中我有一个参考日期 - 并且想要计算不同的个体,每个月份对于REF_DT的任何一方(增加到START_DT / END_DT) - 返回一行,带有月份计数器。
我的基础数据如下:
ID REF_DT START_DT END_DT
-- ------ -------- ------
1 2000-01-01 1998-01-01 2002-01-01
2 2001-06-01 2001-06-01 2003-06-01
3 2003-01-01 1998-01-01 2005-06-01
4 2002-05-01 2003-01-01 2005-01-01
所以在第一行,我会在REF_DT
和START_DT
之间的END_DT
周围返回一行,并返回monthdiff的值。我的基表中的第一行将生成:
ID REF_DT START_DT END_DT MONTHDIFF
-- ------ -------- ------ ---------
1 2000-01-01 1998-01-01 2002-01-01 -24
1 2000-01-01 1998-01-01 2002-01-01 -23
.
.
.
1 2000-01-01 1998-01-01 2002-01-01 24
即。因为START_DT
和END_DT
在REF_DT
我可以通过查询
来查询此查询select distinct id, ref_dt,start_dt,end_dt,
case when ref_dt - 1 month between start_dt and end_dt then -1 end as monthdiff
但是我必须为每个查询手动创建1行。我希望将这种逻辑嵌入比这更聪明的东西中。
感谢。
解决
看到胡安的答案建议。为月份参考创建表的想法奏效了。我通过查看以下堆栈线程generate_series() equivalent in DB2
创建了这个表答案 0 :(得分:1)
简单的方法是创建月份表。 100年需要1200行
allMonths
month_id
date
How can I get a table of dates from the first day of the month, two months ago, to yesterday?
SELECT
YT.id,
YT.ref_dt,
YT.start_dt,
YT.end_dt,
MONTHS_BETWEEN(YT.ref_dt, allDates.date) as MONTHDIFF
FROM YourTable YT
INNER JOIN allDates
ON allDates BETWEEEN YT.START_DT AND YT.END_DT