sql - 为来自同一时间戳列的记录创建日期间隔
问题描述
我有一个表“日期”,其中 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_from 和 valid_to。
Valid_to 日期对应于删除最接近 valid_from 日期的记录,因此这 2 行应合并为一行,保留 removed=true 值(尽管这不是优先级)。在这种情况下,例如,应折叠第 2 行和第 3 行。
然后,对于 valid_to 为 NULL (removed=false) 的每一行,应插入比该行的 valid_from 大的最接近的 valid_from 日期。最近的行(即第一行)后面不会有记录,因此 valid_to 日期将保持为 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 语句,但无法弄清楚如何对实现此结果所需的进程进行排序。
帮助将不胜感激。谢谢你。
解决方案
我想你只是想要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;
推荐阅读
- c# - 如何检索在所有表单中选择的复选框列表?
- r - 如何删除df中非常特殊的字符
- ios - 我怎么能想到 Scene Delegate willconnnectTo 方法?
- amazon-web-services - 如何在 Amazon ECS 中运行外部运行状况检查命令?
- google-chrome-extension - 清单 v3 中的 Google Analytics(分析)
- java - 比较 2 ArrayList java
- javascript - 当页面上只有图像时如何使菜单重叠
- r - 基础 R 图:帮助减少多个图之间的空间
- python-3.x - 在Python中为变量赋值两次
- excel - 创建超过 32 个字符的 SAS 列名称以导出到 Excel