3

データベースに、一連のセンサー読み取り値の日時スタンプを提供する列があります。これらの読み取り値を、途切れのない連続したセンサー読み取り値のセットに分割したいと思います。センサーの読み取り値が壊れている場合は、日時列に不連続性があります。そのため、日時列でクエリを実行してから、連続する読み取り値の差を計算したいと思います。

私のクエリが次のようになっていると仮定します。

select sensor_time from sensor_table limit 10;

私は得るだろう:

+---------------------+
| sensor_time         |
+---------------------+
| 2009-09-28 07:08:12 |
| 2009-09-28 07:08:40 |
| 2009-09-28 07:09:10 |
| 2009-09-28 07:09:40 |
| 2009-09-28 07:10:10 |
| 2009-09-28 07:10:40 |
| 2009-09-28 07:41:10 |
| 2009-09-28 07:41:40 |
| 2009-09-28 07:42:10 |
| 2009-09-28 07:42:40 |
+---------------------+

この例の時間は、私が検出したい07:10から07:41に突然ジャンプします。私の質問は、これらの10個の日時スタンプの9個の時差をどのように計算できるかということです。クエリ全体にtimediff()を適用する方法はありますか?

4

1 に答える 1

9

MySQLでは、変数を使用して各行のセンサー時間を保存し、それを次の行で時間差を計算するときに使用できるため、これは非常に簡単です。この手法は、データを返すSELECTで変数を割り当てることができないため、MSSQLでは機能しません。他のバージョンのSQLでもおそらく機能しません。通常の方法は、オフセット結合を生成することです。これにより、結合は前の行の値を返しますが、これは非常に遅くなる可能性があります。

そうは言っても、MySQLでそれを行う1つの方法は次のとおりです。

SELECT 
    sensor_time,
    time_diff,
    TIME_TO_SEC(time_diff) > 30 AS alarm
FROM (
    SELECT
        sensor_time,
        TIMEDIFF(sensor_time, @prev_sensor_time) AS time_diff,
        @prev_sensor_time := sensor_time AS prev_sensor_time
    FROM sensor_table,
    (SELECT @prev_sensor_time := NULL) AS vars
    ORDER BY sensor_time ASC
) AS tmp;

+---------------------+-----------+-------+
| sensor_time         | time_diff | alarm |
+---------------------+-----------+-------+
| 2009-09-28 07:08:12 | NULL      |  NULL |
| 2009-09-28 07:08:40 | 00:00:28  |     0 |
| 2009-09-28 07:09:10 | 00:00:30  |     0 |
| 2009-09-28 07:09:40 | 00:00:30  |     0 |
| 2009-09-28 07:10:10 | 00:00:30  |     0 |
| 2009-09-28 07:10:40 | 00:00:30  |     0 |
| 2009-09-28 07:41:10 | 00:30:30  |     1 |
| 2009-09-28 07:41:40 | 00:00:30  |     0 |
| 2009-09-28 07:42:10 | 00:00:30  |     0 |
| 2009-09-28 07:42:40 | 00:00:30  |     0 |
+---------------------+-----------+-------+
于 2010-07-09T09:59:29.870 に答える