1

ACQUISITION1 720 208 行のテーブルがあります。

------------------------------------------------------
| id           | date                    | value     |
|--------------|-------------------------|-----------|
| 1820188      | 2011-01-22 17:48:56     | 1.287     |
| 1820187      | 2011-01-21 21:55:11     | 2.312     |
| 1820186      | 2011-01-21 21:54:00     | 2.313     |
| 1820185      | 2011-01-20 17:46:10     | 1.755     |
| 1820184      | 2011-01-20 17:45:05     | 1.785     |
| 1820183      | 2011-01-19 18:21:02     | 2.001     |
------------------------------------------------------

問題に続いて、差が 2 分未満のすべての行を見つける必要があります。

理想的には、ここで見つけることができるはずです:

| 1820187      | 2011-01-21 21:55:11     | 2.312     |
| 1820186      | 2011-01-21 21:54:00     | 2.313     |
| 1820185      | 2011-01-20 17:46:10     | 1.755     |
| 1820184      | 2011-01-20 17:45:05     | 1.785     |

何かアイデアがあれば、私はここでかなり迷っています。

4

2 に答える 2

1

宇宙の熱死の前にこの質問を完成させることができるように、あなたの質問を微妙な方法で言い直しましょう。

「タイムスタンプが 2 分以内に近い、テーブル内の連続するレコードを知る必要があります。」

「連続」の概念を id 値に関連付けることができます。

このクエリを試して、適切なパフォーマンスが得られるかどうかを確認してください ( http://sqlfiddle.com/#!9/28738/2/0 )

SELECT a.date first_date, a.id first_id, a.value first_value,
       b.id second_id, b.value second_value,
       TIMESTAMPDIFF(SECOND, a.date, b.date) delta_t
  FROM thetable AS a
  JOIN thetable AS b  ON b.id = a.id + 1 
                     AND b.date <= a.date + INTERVAL 2 MINUTE

自己結合のワークロードは、 でかかとにされON b.id = a.id + 1ます。また、2 つのdate列の値のいずれかに対する関数を回避すると、その列で使用可能な任意のインデックスをクエリで利用できるようになります。

カバリング インデックスを作成する(id,date,value)と、このクエリのパフォーマンスが向上します。

このデータセットで連続行の仮定が機能しない場合は、これを試して、各行を次の 10 行と比較できます。遅くなります。( http://sqlfiddle.com/#!9/28738/6/0 )

SELECT a.date first_date, a.id first_id, a.value first_value,
       b.id second_id, b.value second_value,
       TIMESTAMPDIFF(SECOND, a.date, b.date) delta_t
  FROM thetable AS a
  JOIN thetable AS b  ON b.id <= a.id + 10
                     AND b.id >  a.id 
                     AND b.date <= a.date + INTERVAL 2 MINUTE

行を並べ替える方法として値がまったく役に立たない場合はid、これが必要になります。そして、それは非常に遅くなります。( http://sqlfiddle.com/#!9/28738/5/0 )

SELECT a.date first_date, a.id first_id, a.value first_value,
       b.id second_id, b.value second_value,
       TIMESTAMPDIFF(SECOND, a.date, b.date) delta_t
  FROM thetable AS a
  JOIN thetable AS b  ON b.date <= a.date + INTERVAL 2 MINUTE
                     AND b.date >  a.date
                     AND b.id <> a.id
于 2015-08-31T15:44:35.360 に答える