【问题标题】:Create interval from discrete dates从离散日期创建间隔
【发布时间】:2020-08-18 12:02:34
【问题描述】:

我有一个函数可以保存多个对象的当前状态并将其写入表中,如下所示:

ObjectId StatusId 日期 1 10 2020-04-04 00:00:00.000 2 10 2020-04-04 00:00:00.000 1 11 2020-04-05 00:00:00.000 2 10 2020-04-05 00:00:00.000 1 10 2020-04-06 00:00:00.000 2 10 2020-04-06 00:00:00.000

我想将其设为按 ObjectId 和 StatusId 分组的间隔。 所以对于上面的首选输出应该是这样的:

ObjectId StatusId StartDate EndDate 1 10 2020-04-04 00:00:00.000 2020-04-04 00:00:00.000 1 11 2020-04-05 00:00:00.000 2020-04-05 00:00:00.000 1 10 2020-04-06 00:00:00.000 2020-04-06 00:00:00.000 2 10 2020-04-04 00:00:00.000 2020-04-06 00:00:00.000

请注意,一个对象可以在多个场合具有相同的状态,但如果它具有不同的状态,则它需要处于单独的间隔中。如此简单的 group by 和 max(Date) 在我的情况下不起作用。 提前致谢。

【问题讨论】:

    标签: sql sql-server date intervals


    【解决方案1】:

    这是一种缝隙和岛屿的形式。为此,行号的差异可能是最简单的方法:

    select objectid, status, min(date), max(date)
    from (select t.*,
                 row_number() over (partition by objectid order by date) as seqnum,
                 row_number() over (partition by objectid, status order by date) as seqnum_2
          from t
         ) t
    group by objectid, status, (seqnum - seqnum_2);
    

    为什么这行得通可能有点难以解释。但是,如果您查看子查询的结果,您会发现对于您想要识别的组而言,差异是如何保持不变的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-07
      • 2021-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-10
      • 1970-01-01
      • 2018-02-17
      相关资源
      最近更新 更多