SQL:按换向状态间隔长度分组

时间:2012-09-27 12:50:28

标签: mysql sql join group-by

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

09:00:00 27.09.2012 10:00:00 27.09.2012 active
10:00:00 27.09.2012 11:00:00 27.09.2012 active
11:00:00 27.09.2012 12:00:00 27.09.2012 active
12:00:00 27.09.2012 13:00:00 27.09.2012 sleeping
13:00:00 27.09.2012 14:00:00 27.09.2012 sleeping
14:00:00 27.09.2012 15:00:00 27.09.2012 active

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

09:00:00 27.09.2012 12:00:00 27.09.2012 active
12:00:00 27.09.2012 14:00:00 27.09.2012 sleeping
14:00:00 27.09.2012 15:00:00 27.09.2012 active

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

1 个答案:

答案 0 :(得分:3)

假设时间段不重叠,您可以在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偏离的一种方式。