2014-01-27 38 views
3

排序我有这样一个表:MySQL的GROUP BY列值块,其他列

 
time  | status 
1390836600 | 1 
1390836605 | 1 
1390836610 | 0 
1390836615 | 0 
1390836620 | 1 
1390836625 | 1 
1390836630 | 1 

我需要输出的数据“分组”的状态,并且按时间排序。诀窍是,我需要以块的分组每次状态变化,与字段:MIN(time), status

因此对于示例数据上面我需要像

 
MIN(time) | status 
1390836600 | 1 
1390836610 | 0 
1390836620 | 1 

输出这不是GROUP BY的行为,它只会将具有相同状态的所有行分组,并且只输出2行。但是有这样的可能吗?

回答

2

这个(连续范围的分组)被称为gaps-and-islands的问题,可以通过使用MySQL仍然不支持的分析函数(特别是ROW_NUMBER())来有效解决。

但是你可以通过以下方式模拟ROW_NUMBER()与会话变量

SELECT MIN(time) time, status 
    FROM 
(
    SELECT time, status, 
     @n := @n + 1 rnum, 
     @g := IF(status = @s, @g + 1, 1) rnum2, 
     @s := status 
    FROM table1 CROSS JOIN (SELECT @n := 0, @g := 0, @s := NULL) i 
    ORDER BY time 
) q 
GROUP BY rnum - rnum2 

输出:

 
|  TIME | STATUS | 
|------------|--------| 
| 1390836600 |  1 | 
| 1390836610 |  0 | 
| 1390836620 |  1 | 

这里是一个SQLFiddle演示