如何在参考日期前每个月生成计数

时间:2015-10-26 12:07:48

标签: sql db2

我正在使用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_DTSTART_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_DTEND_DTREF_DT

两侧24个月后会产生48行

可以通过查询

查询此查询
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

创建了这个表

1 个答案:

答案 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