sql db2 - 滚动30天的最大日期和第二个最大日期

时间:2016-12-01 16:29:16

标签: sql date dynamic db2 max

我当前的声明从表格中提取价格,其中当前价格的人口与表格中的最大或最近日期相关联。记录的最后价格是表格中第二个最大日期的价格。

如何创建一个语句,其中包含过去30天的过去日期,其中最后一个日期始终是找到的前一天?

SELECT
T1.ID
T1.DT_PRICE
T1.PRICE
T2.LAST_DT_PRICE,   
T2.LAST_PRICE

FROM    
 (SELECT    
  fpr.ID,   
  fpr.DT_PRICE, 
  fpr.PRICE 
  FROM UDBADM.PRICES fpr    

  WHERE fpr.DT_PRICE = (select max(DT_PRICE) 
                       from UDBADM.PRICES)  
    AND fpr.CD_PRICE = 'C'
 ) T1

LEFT JOIN   
  (SELECT   
   fpr2.ID, 
   fpr2.DT_PRICE AS LAST_DT_PRICE,  
   fpr2.PRICE AS LAST_PRICE 
   FROM UDBADM.PRICES fpr2  

   WHERE fpr2.DT_PRCE = (select max(DT_PRICE) 
                         from UDBADM.PRICES 
                         where DT_PRICE < (select 
                                          max(DT_PRICE) 
                                          from UDBADM.PRICES))  
   AND fpr2.CD_PRICE = 'C'
  ) T2
ON T1.ID = T2.ID

1条记录的当前输出:

ID     DT_PRICE    PRICE   LAST_DT_PRICE  LAST_PRICE
B5199  11/30/2016  50.3    11/29/2016     50.1

滚动30天的1条记录的预期输出:

ID     DT_PRICE    PRICE   LAST_DT_PRICE  LAST_PRICE
B5199  10/18/2016  50.1    10/17/2016     50
B5199  10/19/2016  50      10/18/2016     50.1
B5199  10/20/2016  49.75   10/19/2016     50
B5199  10/21/2016  49.8    10/20/2016     49.75
B5199  10/24/2016  50.12   10/21/2016     49.8
B5199  10/25/2016  50.2    10/24/2016     50.12
B5199  10/26/2016  50.25   10/25/2016     50.2
B5199  10/27/2016  50.1    10/26/2016     50.25
B5199  10/28/2016  49.8    10/27/2016     50.1
B5199  10/31/2016  49.5    10/28/2016     49.8
B5199  11/1/2016   49.2    10/31/2016     49.5
B5199  11/2/2016   50      11/1/2016      49.2
B5199  11/3/2016   50.1    11/2/2016      50
B5199  11/4/2016   50      11/3/2016      50.1
B5199  11/7/2016   49.75   11/4/2016      50
B5199  11/8/2016   49.8    11/7/2016      49.75
B5199  11/9/2016   50      11/8/2016      49.8
B5199  11/10/2016  50      11/9/2016      50
B5199  11/14/2016  50.1    11/10/2016     50
B5199  11/15/2016  50.1    11/14/2016     50.1
B5199  11/16/2016  49.8    11/15/2016     50.1
B5199  11/17/2016  49.5    11/16/2016     49.8
B5199  11/18/2016  49.2    11/17/2016     49.5
B5199  11/21/2016  48.9    11/18/2016     49.2
B5199  11/22/2016  49.8    11/21/2016     48.9
B5199  11/23/2016  50.2    11/22/2016     49.8
B5199  11/25/2016  50.2    11/23/2016     50.2
B5199  11/28/2016  50.2    11/25/2016     50.2
B5199  11/29/2016  50.1    11/28/2016     50.2
B5199  11/30/2016  50.3    11/29/2016     50.1

1 个答案:

答案 0 :(得分:0)

WITH cte AS (
    SELECT
       fpr.Id
       ,fpr.DT_PRICE
       ,fpr.PRICE
       ,ROW_NUMBER() OVER (PARTITION BY fpr.Id ORDER BY fpr.DT_PRICE) as IdRowNumber
    FROM
       UDBADM.PRICES fpr
    WHERE
       fpr.CE_PRICE = 'C'
       AND fpr.DT_PIRCE >= '10/23/2016'
)

SELECT
    c1.Id
    ,c1.DT_PRICE
    ,c1.PRICE
    ,c2.DT_PRICE as LAST_PRICE_DATE
    ,c2.PRICE as LAST_PRICE
FROM
    cte c1
    INNER JOIN cte c2
    ON c1.Id = c2.Id
    AND c1.IdRowNumber = c2.IdRowNumber + 1

由于您的日期有差距,您可以根据日期生成row_number,然后使用自联接中的行号来获取之前的价格。请注意,INNER JOIN会为您提供准确的输出,但您可能需要考虑LEFT JOIN,以便您的初始价格日期为2016年11月17日,但这取决于您。

至于限制滚动30天如何实现这取决于你的意思。

如果您想要过去30天内的任何价格,那么在公用表表达式中添加where条件,该表达式查找DT_PRICE&gt;当前日期 - 30天。

如果您想要最后30个价格记录而不考虑日期,那么只需将row_number翻转为DESCENDING并选择前30个记录,如下所示:

WITH cte AS (
    SELECT
       fpr.Id
       ,fpr.DT_PRICE
       ,fpr.PRICE
       ,ROW_NUMBER() OVER (PARTITION BY fpr.Id ORDER BY fpr.DT_PRICE DESC) as IdRowNumber
    FROM
       UDBADM.PRICES fpr
    WHERE
       fpr.CE_PRICE = 'C'
)

SELECT
    c1.Id
    ,c1.DT_PRICE
    ,c1.PRICE
    ,c2.DT_PRICE as LAST_PRICE_DATE
    ,c2.PRICE as LAST_PRICE
FROM
    cte c1
    INNER JOIN cte c2
    ON c1.Id = c2.Id
    AND c1.IdRowNumber = c2.IdRowNumber - 1
WHERE
    c1.IdRowNumber <= 30