【问题标题】:Creating date intervals for records from same timestamp column为来自同一时间戳列的记录创建日期间隔
【发布时间】:2019-11-11 23:16:52
【问题描述】:

我有一个表“日期”,其中 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 日期的记录,因此应将这两行合并为一行,保留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 语句,但不知道如何对实现此结果所需的进程进行排序。

我们将不胜感激。 谢谢。

【问题讨论】:

  • 我特别没有包括一个,因为我没有使用它们,我正在为公司数据库使用特定的 SQL 改编。不过,我还没有找到缺失的功能,所以我认为几乎任何答案都适合我。
  • TOP 不是标准的 SQL 开头...
  • 正确...它确实混合了一些功能。也许我不能尽可能多地指定查询...我应该删除@a_horse_with_no_name 吗?

标签: sql


【解决方案1】:

我想你只是想要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;

【讨论】:

    猜你喜欢
    • 2018-02-07
    • 1970-01-01
    • 2014-05-22
    • 1970-01-01
    • 1970-01-01
    • 2021-03-11
    • 2011-03-23
    • 1970-01-01
    相关资源
    最近更新 更多