1

有一个event带有属性start, end,的表status。可能有以下条目:

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 方言,我也可以翻译它,只要它不使用一些奇怪的供应商功能。

4

1 回答 1

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_NUMBERMySQL 不支持的 ANSI 标准函数。小心你所说的“一些奇怪的供应商功能”。大多数数据库在某种程度上偏离了标准。这是 MySQL 偏离的一种方式。

于 2012-09-27T13:12:44.620 回答