2

次のシナリオがあります。

SQLDbx の使用 - データベース: DB2

次の SQL

WITH priceanddates AS 
(
    SELECT a.*
    FROM FPRICE a
    INNER JOIN
    (
        SELECT edate, MAX(idx) maxIdx
        FROM FPRICE
        WHERE price>0
        GROUP BY edate
    ) b ON a.edate = b.edate AND a.idx = b.maxIdx
)

SELECT *
FROM priceanddates 
WHERE fcode='XYZ'
ORDER BY edate 

収量:

fcode    edate       idx    price
XYZ      2010-09-17    2    34,3
XYZ      2010-09-20    2    34,3
XYZ      2010-09-21    2    34,3
XYZ      2010-09-22    2    34,3
XYZ      2010-09-23    2    35,7
XYZ      2010-09-24    2    34,5
XYZ      2010-09-27    2    35,5

しかし-もっと何かが必要です...次のように、日付の有効性について何かを言う最後の選択に列を追加したいと思います:

fcode    edate_from    edate_to       idx    price
XYZ      2010-09-17    2010-09-20       2    34,3
XYZ      2010-09-20    2010-09-21       2    34,3
XYZ      2010-09-21    2010-09-22       2    34,3
XYZ      2010-09-22    2010-09-23       2    34,3
XYZ      2010-09-23    2010-09-24       2    35,7
XYZ      2010-09-24    2010-09-27       2    34,5
XYZ      2010-09-27    2010-09-30       2    35,5

したがって、edate_to は「次の」edate_from に基づいています (ビューは現在日付順に並べられているため)、または (うまくいけば正しく推測したように) edate_to は単に MIN (「現在の」edate より大きい edate) です。

DB 内のすべての日付の最終締切日は 2010-09-30 ですが、最後の edate_to は常に 2010-09-30 でなければなりません。

明らかに、私はSQLを書くことに関してはあまり熟練していません。うまくいけば、誰かが私を正しい方向に向けることができます.探していた...

乾杯、ドリット。

4

2 に答える 2

1

多分:

WITH priceanddates AS 
(
    SELECT a.*,
           (SELECT COALESCE(MIN(aa.edate), '2010-09-30')
            FROM FPRICE aa 
            WHERE aa.edate > a.edate) AS edate_to       
    FROM FPRICE a
    INNER JOIN
    (
        SELECT edate, MAX(idx) maxIdx
        FROM FPRICE
        WHERE price>0
        GROUP BY edate
    ) b ON a.edate = b.edate AND a.idx = b.maxIdx
)

SELECT *
FROM priceanddates 
WHERE fcode='XYZ'
ORDER BY edate
于 2013-03-19T12:37:56.827 に答える
0

新しいLEAD機能を使用してください。詳しくはこちら

WITH priceanddates AS 
(
    SELECT a.*
    FROM FPRICE a
    INNER JOIN
    (
        SELECT edate, MAX(idx) maxIdx
        FROM FPRICE
        WHERE price>0
        GROUP BY edate
    ) b ON a.edate = b.edate AND a.idx = b.maxIdx
)

SELECT fcode
       , edate AS edate_from
       , LEAD (edate) OVER (ORDER BY edate) AS edate_to
       , idx
       , price
FROM priceanddates 
WHERE fcode='XYZ'
ORDER BY edate 
于 2013-03-19T12:33:39.203 に答える