我有一个包含日期列的表。
ID | Date
----|-----------
1 | 2000-01-01
2 | 2000-02-01
3 | 2000-02-01
4 | 2000-03-01
我需要一个选择,为每行返回ID,日期和大于当前日期的最小日期(表中所有日期)。
ID | Date | Next date
----+------------+------------
1 | 2000-01-01 | 2000-02-01
2 | 2000-02-01 | 2000-03-01
3 | 2000-02-01 | 2000-03-01
4 | 2000-03-01 | (NULL)
我的第一个方法是
SELECT id, date, LEAD (date, 1) OVER (ORDER BY date NULLS LAST) AS next_date
FROM t
但这仅在DATE列中的值唯一时才有效。
有任何想法吗?
您可以将分析函数与windowing子句一起使用。lead()
不支持windowing子句,因此您需要使用likemin()
或first_value()
:
FIRST_VALUE ("Date")
OVER (ORDER BY "Date" RANGE BETWEEN 1 FOLLOWING AND UNBOUNDED FOLLOWING)
默认的windowing子句是RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
,它将为您的所有行赋予相同的值,2000-01-01
并且使用ROWS
窗口会遇到lead()
与重复日期相同的问题(ID 2仍然会得到2000-02-01
; ID 4会得到,2000-03-01
而不是null您使用的ROWS BETWEEN CURRENT ROW...
是您而不是1 FOLLOWING
)。
演示使用此范围:
with t (ID, "Date") as (
select 1, date '2000-01-01' from dual
union all select 2, date '2000-02-01' from dual
union all select 3, date '2000-02-01' from dual
union all select 4, date '2000-03-01' from dual
)
select id, "Date", FIRST_VALUE ("Date") OVER (ORDER BY "Date"
RANGE BETWEEN 1 FOLLOWING AND UNBOUNDED FOLLOWING) AS next_date
FROM t;
ID Date NEXT_DATE
---------- ---------- ----------
1 2000-01-01 2000-02-01
2 2000-02-01 2000-03-01
3 2000-02-01 2000-03-01
4 2000-03-01
仅考虑日期值高于当前行的行。而且这仍然只需要敲桌子一次。
(我"Date"
用双引号引起来,因为这date
是一个保留字;从您的示例数据中看,它看起来像是带引号的标识符,但是在查询中没有用引号引起来,因此它实际上可能只是一个更明智的名称...)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句