Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 选择:基于子选择添加列_Sql_Select_Db2 - Fatal编程技术网

Sql 选择:基于子选择添加列

Sql 选择:基于子选择添加列,sql,select,db2,Sql,Select,Db2,我有以下情况: 使用SQLDbx-database: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

我有以下情况:

使用SQLDbx-database: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,最后一个截止日期必须始终为2010-09-30

显然,我在编写SQL方面不是很熟练,希望有人能给我指出正确的方向——甚至更好——提供一个解决方案:) 我确实找了一段时间,但我真的找不到我要找的东西


干杯,德里特。

使用新的
LEAD
功能。 更多关于它

也许:


谢谢不幸的是,看起来我们的DB有点像石器时代的……它不喜欢铅(或者至少是9.7之前的铅)忘记考虑这样的解决方案。应该可以在大多数平台上正常工作。有用的解决方案。谢谢
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 
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