为同一时间戳列中的记录创建日期间隔

时间:2019-07-01 09:38:43

标签: sql

我有一个表“ dates”,其中2列代表对象说明从其生效的日期,以及直到其有效的日期(valid_from和valid_to),例如:

 ID   valid_from      valid_to      removed

  1   2019-06-27         -           false
  1        -         2019-06-26      true  
  1   2019-05-16         -           false   
  1   2019-05-08         -           false
  1   2019-05-07         -           false

我需要做的是为所有这些行获取明确的时间间隔,为每行定义一个有效的_起始和有效的_至。

Valid_to日期对应于在其自身之前具有最接近有效日期的记录的删除,因此应将这两行折叠为1,并保持remove = true值(尽管这不是优先级)。例如,在这种情况下,第2行和第3行应合拢。

然后,对于有效行为NULL的每一行(已删除=假),应插入比该行的有效日期大的最接近的有效日期。 最近的行(第一行)后面没有记录,因此有效日期将保持为NULL。

因此,得出的结果将是:

 ID   valid_from      valid_to      removed

  1   2019-06-27         -           false
  1   2019-05-16     2019-06-26      true  
  1   2019-05-08     2019-05-16      false
  1   2019-05-07     2019-05-08      false

这不能通过对值或条件限制进行硬编码来完成,因为这只是一张更大的表的一部分,应该对每个ID组执行该操作。


我试图在INSERT INTO语句内的子查询上使用TOP语句,但无法弄清楚如何对实现此结果所需的过程进行排序。

我们将不胜感激。 谢谢。

1 个答案:

答案 0 :(得分:0)

我认为您只想要lead()

select valid_from, next_valid_to,
       coalesce(next_result, result) as result
from (select t.*,
             lead(coalesce(valid_from, valid_to)) over (partition by id order by coalesce(valid_from, valid_to)) as next_valid_to,
             lead(removed) over (partition by id order by coalesce(valid_from, valid_to)) as next_result
      from t
     ) t
where valid_from is not null;