【问题标题】:how do produce counts for every month around a reference date如何在参考日期前后每个月产生计数
【发布时间】:2015-10-26 12:07:47
【问题描述】:

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

所以取第一行,我在START_DTEND_DT 之间存在的REF_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

即将产生 48 行,因为 START_DTEND_DTREF_DT 两侧的 24 个月

可以通过查询来查询此查询,即

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 行。我希望将这个逻辑嵌入到比这更聪明的东西中。

谢谢。

已解决

请参阅 Juan 的建议以获取答案。为月份参考创建一个表的想法奏效了。我通过查看以下堆栈线程 generate_series() equivalent in DB2

创建了此表

【问题讨论】:

  • REF_DT, START_DTEND_DT 对你想要的输出中的所有MONTHDIFF 都一样吗?
  • @Juan - 并不是每个人都不同。但是我不介意事先指定固定的边界,例如 5 年左右,因为我知道这将捕获我的所有数据
  • 我的意思是在你的输出结果中。 4 第一列完全相同

标签: sql db2


【解决方案1】:

简单的方法是创建一个月份表。 100 年需要 1200 行

所有月份

 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

【讨论】:

  • 感谢这项工作 - 生成月份参考的数字表是关键
猜你喜欢
  • 1970-01-01
  • 2017-03-17
  • 1970-01-01
  • 1970-01-01
  • 2021-07-31
  • 2016-10-07
  • 1970-01-01
  • 2021-01-01
  • 1970-01-01
相关资源
最近更新 更多