SQL:获取每行的下一个日期值

D.米卡

我有一个包含日期列的表。

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章