【问题标题】:SQL: Group by unchange status interval lengthSQL:按不变状态间隔长度分组
【发布时间】:2012-09-27 12:50:28
【问题描述】:

有一个表event,其属性为startendstatus。可能有以下条目:

09:00:00 27.09.2012 10:00:00 27.09.2012 有效 10:00:00 27.09.2012 11:00:00 27.09.2012 有效 11:00:00 27.09.2012 12:00:00 27.09.2012 活动 12:00:00 27.09.2012 13:00:00 27.09.2012 睡觉 13:00:00 27.09.2012 14:00:00 27.09.2012 睡觉 14:00:00 27.09.2012 15:00:00 27.09.2012 活跃

现在我想提取状态没有改变的区间。这个例子的结果是:

09:00:00 27.09.2012 12:00:00 27.09.2012 有效 12:00:00 27.09.2012 14:00:00 27.09.2012 睡觉 14:00:00 27.09.2012 15:00:00 27.09.2012 活跃

是否有一些 SQL 习惯用法来创建这种结果?我使用的是 MySQL,但如果你给我一些其他 SQL 方言,我也可以翻译它,只要它不使用一些奇怪的供应商功能。

【问题讨论】:

    标签: mysql sql join group-by


    【解决方案1】:

    假设时间段不重叠,您可以在 MySQL 中使用相关子查询执行此操作:

     select min(start) as start, max(end) as end, e.status
     from (select e.*,
                 (select min(start)
                  from event e2
                  where e2.status <> e.status and e2.start > e.start
                 ) as nextperiodstart
          from event e
         ) e
     group by status, nextperiodstart
     order by 1
    

    这使用下一个周期的开始来标识正在完成的组。

    顺便说一句,我会在几乎任何其他数据库中使用ROW_NUMBER 执行此操作,这是 MySQL 不支持的 ANSI 标准函数。小心你所说的“一些奇怪的供应商功能”。大多数数据库在某种程度上偏离了标准。这是 MySQL 偏离的一种方式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-09-21
      • 2020-03-09
      • 1970-01-01
      • 2010-09-16
      • 2021-01-03
      • 2017-05-11
      相关资源
      最近更新 更多