【问题标题】:SQL DB2 dynamic date select rolling 6 months with second variable pulling last monthSQL DB2 动态日期选择滚动 6 个月,上个月拉第二个变量
【发布时间】:2017-03-28 19:51:36
【问题描述】:

我有一个仅在工作日更新的每日价格表。我正在尝试创建两个动态日期变量,它们允许我提取每个月的最大日期的滚动 6 个月视图,以及基于第一个变量的第二个变量,该变量具有相应的上个月末最大日期(所以基本上是 7 个月末)。

这是我的代码,但我不知道从哪里开始。我应该使用 DATEDIFF 或 GROUP BY 之类的函数,然后在 MONTH 上使用 PARTITION,还是创建一个排序器并开始计算行数?非常感谢任何帮助!

WITH dtt as (SELECT
CURRENT_DATE - DAY(CURRENT_DATE) DAYS V_EOM1,
CURRENT_DATE - (DAY(CURRENT_DATE)-1) DAYS - 1 MONTH - 1 DAY V_EOM2
FROM SYSIBM.SYSDUMMY1)

SELECT
dph.ID,
V_EOM1,
dph.AMT_PRCE AS PRICE,
V_EOM_LAST,
fpr2.AMT_PRCE AS LAST_PRICE

FROM dtt LEFT JOIN
      UDBADM.D_PRICE_HIST dph
      ON dph.DT_PRCE = V_EOM1 LEFT JOIN
      UDBADM.D_PRICE_HIST dph2
      ON dph.ID = dph2.ID AND dph2.DT_PRCE = dtt.V_EOM_LAST

WHERE dph.ID = '444128'

如果我只是从上个月(最后一个)月的月底开始滚动 1 个月,这就是我目前得到的结果:

ID       V_EOM        PRICE  V_EOM_LAST   LAST_PRICE
444128   10/31/2016   2700   09/30/2016   2600

这是我试图通过拉动每个月的最大日期的滚动 6 个月来实现的(注意 4 月和 7 月的月末落在周末,所以最大日期不是该月的最后一个日历日):

ID       V_EOM        PRICE  V_EOM_LAST   LAST_PRICE
444128   05/31/2016   2550   04/29/2016   2750
444128   06/30/2016   2500   05/31/2016   2550
444128   07/29/2016   2400   06/30/2016   2500
444128   08/31/2016   2650   07/29/2016   2400
444128   09/30/2016   2600   08/31/2016   2650
444128   10/31/2016   2700   09/30/2016   2600

请求您的帮助和指导

编辑:如果更像这样的话,EOM5 是日历 06/30/2016,EOM4 是日历 07/31/2016,所以在这两个日期之间找到的最大日期是 07 /29/2016:

SELECT
MAX(DT_PRCE) AS "Max_Date_EOM4"
FROM UDBADM.D_PRICE_HIST
WHERE DT_PRCE BETWEEN
 (SELECT CURRENT DATE -(DAY(CURRENT_DATE)-1) DAYS - 4 MONTH - 1 DAY 
    AS "EOM5" FROM SYSIBM.SYSDUMMY1)
 AND (SELECT CURRENT_DATE - (DAY(CURRENT_DATE)-1) DAYS - 3 MONTH - 1 DAY
    AS "EOM4" FROM SYSIBM.SYSDUMMY1)

【问题讨论】:

    标签: sql date variables db2 sequence


    【解决方案1】:

    我不明白你想要什么。请在之前/之后放一个示例数据

    第二个查询不要使用 SYSIBM.SYSDUMMY1

    如果您只想在 2 个固定日期之前选择

    SELECT
    MAX(DT_PRCE) AS "Max_Date_EOM4"
    FROM UDBADM.D_PRICE_HIST
    WHERE DT_PRCE BETWEEN cast('2016-06-30' as date) and cast('2016-07-37' as date)
    

    如果你想要最后一天

    SELECT MAX(DT_PRCE) AS "Max_Date_EOM4"
    FROM UDBADM.D_PRICE_HIST
    WHERE DT_PRCE BETWEEN 
    last_day(current date - 5 month) and
    last_day(current date - 4 month)
    

    【讨论】:

      【解决方案2】:
      with tmp1 as (
      select id, price,
      last_day(current date + (rownumber() over(order by id) - 7) month ) V_EOM,                                                    
      last_day(current date + (rownumber() over(order by id) - 8) month) V_EOM_LAST                                                    
      from UDBADM.D_PRICE_HIST WHERE ID = '444128' 
      ),
      tmp2 as (
      select id, price, V_EOM, 
      case DAYOFWEEK(V_EOM_LAST) 
      when 7 then V_EOM_LAST - 1 day
      when 1 then V_EOM_LAST - 2 day
      else V_EOM_LAST end as V_EOM_LAST
      from tmp1
      )
      
      select f1.*, f2.price last_price from tmp2 f1 
      LEFT JOIN UDBADM.D_PRICE_HIST f2 ON (f1.ID, f1.V_EOM_LAST)  = (f2.ID, f2.DT_PRCE)
      

      【讨论】:

      • 谢谢你,Esperento57。我应该提到,数据库中也没有假期的记录,因此如果一个月中的最大日期落在假期的工作日,则周末减去 1 或 2 天将不起作用。 Max函数还有其他方法吗?
      • 我想我回答了你的问题。但是您另外提出的要求更加困难。系统没有节假日管理功能(不可行,因为节假日取决于国家、地区等)。你应该给自己制作一张假期表,包括假期的开始和结束。因此,如果您的最后一天在间隔内,您可以要求它减去休息天数。
      • 我无法让它工作。我真的需要在滚动 6 个月的月份内在数据库中找到的最大日期。发布了一个更新的示例。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-06
      • 1970-01-01
      • 1970-01-01
      • 2013-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多