有一个表event
,其中包含start
,end
,status
属性。可能有以下条目:
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方言,我也可以翻译它,只要它不使用一些奇怪的供应商功能。
答案 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偏离的一种方式。