2016-11-15 4 views
0

私は、営業日にのみ更新する毎日の価格表を持っています。私は、各月の最大日付のローリング6ヶ月ビューと、対応する先月末の最大日付を持つ最初の変数に基づいた2番目の変数を取得するための2つの動的日付変数を作成しようとしています(したがって、 )。SQL DB2動的日付選択ローリング先月の2番目の変数を使用して6か月

ここは私のコードですが、ここからどこに行くのかは分かりません。 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 

あなたの助けを要求し、

EDIT:EOM5はカレンダー06/30/2016、EOM4はカレンダー07/31/2016ですので、データベース内のレコードを持つ2つの日付の間の最大日付は2016年7月29日であること:

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) 

答えて

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

ありがとう、Esperento57。私は休日である日にもデータベースにレコードがないことを言及していたはずですので、1ヶ月の最大日付が休日である週の日に該当する場合、週末から1日または2日を引いた日付は機能しません。 Max関数で別の方法がありますか? – steveW

+0

私はあなたの質問に答えたと思います。しかし、あなたが求めていることはさらに困難です。このシステムには休日を管理する機能はありません(休暇は国や地域などに依存するため実行できません)。あなたは休暇の始まりと終わりに、自分自身を休暇のテーブルにしてください。それで、最後の日がその間隔にある場合、休暇の日数を引くことを求めることができます。 – Esperento57

+0

私はそれを働かせることはできません。私は実際に6ヶ月間の回転の1ヶ月以内にデータベースにある最大の日付を必要とします。更新された例を投稿しました。 – steveW

0

私はあなたが望むものを理解しません。 2番目のクエリのためにしてください

後/データの前に例のデータを入れてあなたが最後の日

にしたい場合は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) 

を固定する前にあなただけを選択したい場合

にSYSIBM.SYSDUMMY1を使用してはいけません

関連する問題