背景资料:我正在一个私人pingdom.com克隆工作。
如果网站可用,我有一张状态检查表,当然还有检查日期。他们中的一些人具有状态" ok",一些"不好"。现在我想按状态对行进行分组,但只需要在同一时间#"时间帧"中对行进行分组。
示例:
id status timestamp
1 ok 1234
2 ok 1235
3 not ok 1236
4 ok 1237
查询应该制作三个ID为1-2,3和4的组。最后我要显示测试的网站在线2小时,离线1小时,然后再在线1小时。当然我之后可以过滤结果,但我认为这对于大型数据集来说效率非常低。
我完全不知道从哪里开始,因为你不能只按状态分组。对搜索词的简短帮助就足够了,英语不是我的第一语言。
答案 0 :(得分:1)
尝试此查询:
SELECT min( timestamp ) from_timestamp,
max( timestamp ) to_timestamp,
max( timestamp) - min( timestamp ) + 1 how_long,
min( id ) from_id,
max( id ) to_id,
status
FROM (
SELECT t.id,
t.timestamp,
if(@last_status = status, @group, @group:=@group+1) group_number,
@last_status := status as status
FROM table1 t
CROSS JOIN (
SELECT @last_status := null, @group:=0
) as init_vars
ORDER BY t.timestamp
) q
GROUP BY group_number
ORDER BY from_timestamp
演示: - > http://www.sqlfiddle.com/#!2/2aa1e/10