2016-12-01 87 views
0

我當前的聲明從當前價格的人口數與表中找到的最大或最近日期相關聯的表中提取價格。記錄的最後價格是來自表中第二個最大日期的價格。sql db2 - 滾動30天的最大日期和第二最大日期

我該如何創建一個語句,它會在過去的日期中拖動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 

預期輸出1紀錄滾動30天:

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 
+0

對不起不明白你的邏輯。同時向我們展示示例數據以獲取該輸出。請閱讀[** How-to-Ask **](http://stackoverflow.com/help/how-to-ask) \t \t這裏是一個偉大的放置到[** START **](http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/)以瞭解如何改善您的質量問題並獲得更好的答案。 –

回答

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,這樣你的初始價格日期爲11/17/2016,但這取決於你。

至於限制爲30天滾動如何實現,取決於你的意思。

如果您需要過去30天內的任何價格,請在公用表格中添加一個where條件,該條件查找DT_PRICE>當前日期 - 30天。

然而,如果你想在過去的30條價格記錄,而不管日期則剛好翻轉ROW_NUMBER是在降序和選擇前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 
+0

嗨@Matt,你發佈的第一個聲明效果很好!謝謝!我應該在哪裏輸入要返回的DT_PRICE日期範圍或最大行數?我試着在CTE的末尾輸入一個AND語句,並說:AND fpr.DT_PIRCE> = '11/23/2016',例如爲了得到幾天的價值 - 我注意到了一件事情 - 如果一個記錄是新的,沒有LAST_PRICE_DATE和LAST_PRICE,它不會出現在輸出中。是否有快速解決方案來包含LAST_PRICE_DATE和LAST_PRICE有NULLS的記錄? – steveW

+0

@steveW歡迎您。感謝您接受不要忘記註冊。至於在哪裏輸入取決於你想要的最大行數或最小日期,例如, 30條記錄,然後使用限制記錄的第二條語句。如果你想要最近30天,然後輸入cte和DT_PRICE,我編輯它使它更清晰。希望你一切都安定下來。歡呼聲 – Matt

+0

只是另一件事 - 你建議追加一個子查詢或調整和聲明到OR帳戶的最後日期和價格是空的記錄?該查詢當前排除具有NULL最後日期和價格的任何記錄。 – steveW

相關問題