2016-01-20 65 views
3

我有一个表格有两列,日期为DateTime和值为INT(有3个可能的值为1,2,3)SQL,如何找到列值的变化

表中的数据是这样的:

Date      , Value 
--------------------------------------- 
2016-01-01 10:34:00    1 
2016-01-01 10:35:00    1 
2016-01-01 10:36:00    1 
2016-01-01 10:37:00    1 
2016-01-01 10:38:00    1 
2016-01-01 10:39:00    3 
2016-01-01 10:40:00    3 
2016-01-01 10:41:00    2 
2016-01-01 10:42:00    2 
2016-01-01 10:43:00    2 
2016-01-01 10:44:00    1 
2016-01-01 10:45:00    1 
2016-01-01 10:46:00    1 
2016-01-01 10:47:00    1 

我需要一个SQL查询(特别是在MySQL的)产生输出:

Start Date    , End Date   , value 
--------------------------------- 
2016-01-01 10:34:00  , 2016-01-01 10:38:00 , 1 
2016-01-01 10:39:00  , 2016-01-01 10:40:00 , 3 
2016-01-01 10:41:00  , 2016-01-01 10:43:00 , 2 
2016-01-01 10:44:00  , 2016-01-01 10:47:00 , 1 

这可能吗? 请帮忙。谢谢

+0

你总是会想这个按照你的例子中的日期排序? – Windle

回答

0

最快的方法是用变量。您需要定义一组参数,每次价值的变化而变化:

select min(date), max(date), value 
from (select t.*, 
      (@grp := if(@v = value, @grp, 
         if(@v := value, @grp + 1, @grp + 1) 
         ) 
      ) as grp 
     from t cross join 
      (select @grp := 0, @v := -1) params 
     order by date 
    ) t 
group by grp, value; 
0

这里多了一个

SELECT min(my_date), max(my_date), val 
FROM (
    SELECT @nr := IF(@old_val = val, @nr, @nr := @nr +1) AS nr 
    , @old_val := val 
    , t.* 
    FROM onoff t 
    ,(SELECT @nr:=0, @old_val='') AS tmp 
    ORDER BY my_date 
) AS t1 
    GROUP BY nr 
    ORDER BY min(my_date); 

CREATE TABLE `onoff` (
    `my_date` datetime NOT NULL, 
    `val` int(11) DEFAULT NULL, 
    PRIMARY KEY (`my_date`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

INSERT INTO `onoff` (`my_date`, `val`) 
VALUES 
    ('2016-01-01 10:34:00', 1), 
    ('2016-01-01 10:35:00', 1), 
    ('2016-01-01 10:36:00', 1), 
    ('2016-01-01 10:37:00', 1), 
    ('2016-01-01 10:38:00', 1), 
    ('2016-01-01 10:39:00', 3), 
    ('2016-01-01 10:40:00', 3), 
    ('2016-01-01 10:41:00', 2), 
    ('2016-01-01 10:42:00', 2), 
    ('2016-01-01 10:43:00', 2), 
    ('2016-01-01 10:44:00', 1), 
    ('2016-01-01 10:45:00', 1), 
    ('2016-01-01 10:46:00', 1), 
    ('2016-01-01 10:47:00', 1);