2016-01-20 43 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);