2016-12-01 15 views
0

現在の価格の人口がテーブル内の最大または最新の日付に関連付けられているテーブルから価格を引き出します。記録の最後の価格は、テーブルに記載されている2番目の最大日からの価格です。sql db2 - 最大日付とローリング30日目の2番目の最大日付

最後の日付が常に前日である場合、過去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つのレコードの電流出力:30日の圧延と1つのレコードの

ID  DT_PRICE PRICE LAST_DT_PRICE LAST_PRICE 
B5199 11/30/2016 50.3 11/29/2016  50.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 
+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を考慮して、2016年11月17日の初期価格日付を表示することができますが、それはあなた次第です。

ローリング30日に制限する限り、それを達成する方法は、それが何を意味するかによって異なります。

過去30日間の価格を希望する場合は、DT_PRICE>現在の日付 - 30日を検索する共通テーブル式にwhere条件を追加します。

あなたは関係なく、日付の最後の30回の価格の記録をしたいしかし、その後ちょうどDESCENDINGされる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 '、例えば数日間の価値を得るために - 私は1つのことに気付きました - LAST_PRICE_DATEおよびLAST_PRICEを持たない場合、出力には表示されません。 LAST_PRICE_DATEとLAST_PRICEにNULLSを持つレコードを含めるための迅速なソリューションはありますか? – steveW

+0

@steveWよろしくお願いします。受け入れてくれてありがとう、upvoteにも忘れないでください。あなたが望むものに依存する最大行数または最小日数を入力する場所。 30レコードは、レコードを制限する2番目のステートメントを使用します。あなたが最後の30日後にcteとDT_PRICEを入力したいのであれば、それをもう少し明確にするために編集しました。あなたがすべて揃っていることを願って。歓声 – Matt

+0

ちょうどもう1つのこと - 最後の日付と価格がNULLのレコードについては、サブクエリを追加するか、またはANDとステートメントをORに調整することをお勧めしますか?クエリは、現在、最後の日付と価格がNULLのレコードを除外します。 – steveW

関連する問題