选择:根据子选择添加列

时间:2013-03-19 12:25:10

标签: sql select db2

我有以下情况:

使用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)

数据库中所有日期的最终截止日期是2010-09-30,唉最后一个edate_to必须始终是2010-09-30。

显然,在编写SQL方面我不是很熟练,希望有人可以指出我正确的方向 - 甚至更好 - 提供解决方案:) 我在SO周围搜索了一段时间,但我找不到我想要的东西......

干杯,Dritt。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

使用新的LEAD功能。 更多信息here

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