我有以下情况:
使用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。
答案 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