我有一个表“ 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语句,但无法弄清楚如何对实现此结果所需的过程进行排序。
我们将不胜感激。 谢谢。
答案 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;