2016-04-05 3 views
1

私は以下のようなデータを持っているとします。文が変更されたときにSQLのデータを取得する

+-------+-------+ 
| time | status | 
+-------+-------+ 
| 01:00 | On | 
| 02:00 | On | 
| 03:00 | On | 
| 04:00 | Off | 
| 05:00 | On | 
| 06:00 | On | 
| 07:00 | Off | 
| 08:00 | Off | 
| 09:00 | On | 
| 10:00 | On | 
| 11:00 | Off | 
+-------+-------+ 

私の予想結果テーブルには、?私の期待される結果になりたいクエリを作成する方法

+-------+-------+ 
| On | Off | 
+-------+-------+ 
| 01:00 | 04:00 | 
| 05:00 | 07:00 | 
| 09:00 | 11:00 | 
+-------+-------+ 

である私は、このケースにデコードを使用できない場合ので。

これが私のテーブルコマンド

私は日時やengine_statusを使用したい
CREATE TABLE `gps_data` (
    `id` int(255) NOT NULL AUTO_INCREMENT, 
    `imei_no` int(255) DEFAULT NULL, 
    `car_identification_no` varchar(255) DEFAULT NULL, 
    `datetime` bigint(10) DEFAULT NULL, 
    `longitude` float(10,7) DEFAULT NULL, 
    `latitude` float(10,7) DEFAULT NULL, 
    `engine_status` varchar(100) DEFAULT NULL, 
    `speed` int(100) DEFAULT NULL, 
    `mileage` bigint(255) DEFAULT NULL, 
    `alarm` int(20) DEFAULT NULL, 
    `address` varchar(255) DEFAULT NULL, 
    PRIMARY KEY (`id`), 
    KEY `car_identification_no` (`car_identification_no`) 
) ENGINE=MyISAM AUTO_INCREMENT=430564 DEFAULT CHARSET=latin1 

(オン/オフ)

おかげ作成

+0

対応するテーブルの 'create table code 'を共有してください。 – 1000111

+0

こんにちは私は上に提供しています.... –

答えて

1

これを試してみてください:

SELECT MIN(CASE WHEN (grp - 1) MOD 2 + 1 = 1 THEN `time` END) AS 'On', 
     MIN(CASE WHEN (grp - 1) MOD 2 + 1 = 2 THEN `time` END) AS 'Off' 
FROM (
    SELECT `time`, `status`, 
     @grp := IF(@prev_status = `status`, @grp, 
        IF(@prev_status := `status`, @grp + 1, @grp + 1)) AS grp 
    FROM mytable 
    CROSS JOIN (SELECT @grp := 0, @prev_status = '') AS vars 
    ORDER BY `time`) AS t 
GROUP BY (grp - 1) DIV 2 

Demo here

説明:

内側問合せ:

# time, status, grp 
    ====================== 
    01:00:00, On,  1 
    02:00:00, On,  1 
    03:00:00, On,  1 
    04:00:00, Off, 2 
    05:00:00, On,  3 
    06:00:00, On,  3 
    07:00:00, Off, 4 
    08:00:00, Off, 4 
    09:00:00, On,  5 
    10:00:00, On,  5 
    11:00:00, Off, 6 

だから@grpが同じ有する連続レコードを識別する:

SELECT `time`, `status`, 
     @grp := IF(@prev_status = `status`, @grp, 
       IF(@prev_status := `status`, @grp + 1, @grp + 1)) AS grp 
FROM mytable 
CROSS JOIN (SELECT @grp := 0, @prev_status = '') AS vars 
ORDER BY `time` 

は以下見派生テーブルを生成するために変数を使用しstatus値。

外部クエリグループgrpを2で割った値。これは、本質的に連続して、On - Offのペアをグループ化します。最後に、条件付き集計を使用して、同じSELECTの両方を得ることができます。On,Offの値です。

+0

私の作成テーブルを置く上に、あなたの返信のための@ giorgosこんにちは@日時とengine_statusのテーブルベースの列を使用したい –

+0

こんにちは@Giorgos、ありがとう:) –

1
SELECT t1.t "On", MIN(t2.`time`) "Off" 
FROM (
    SELECT `datetime` t, @stat := engine_status s 
    FROM gps_data JOIN (SELECT @stat='') vars 
    WHERE engine_status != @stat) t1 
JOIN gps_data t2 ON t1.t < t2.`datetime` 
WHERE t1.s = 'On' AND t2.engine_status = 'Off' 
GROUP BY t1.t; 
関連する問題