現在、私はこのようにテーブルを構築しています
DeviceID Timestamp Value
----------------------------------------
Device1 1.1.2011 10:00:00 3
Device1 1.1.2011 10:00:01 4
Device1 1.1.2011 10:00:02 4
Device1 1.1.2011 10:00:04 3
Device1 1.1.2011 10:00:05 4
Device1 1.1.2011 14:23:14 8
Device1 1.1.2011 14:23:15 7
Device1 1.1.2011 14:23:17 4
Device1 1.1.2011 14:23:18 2
ご覧のとおり、特定のタイムスタンプを持つデバイスからいくつかの値が入力されています(列の種類は日時です)。
問題は、デバイスはいつでも開始および停止でき、データ内に開始または停止が発生したという直接的な情報がないことです。ただし、2つの行のタイムスタンプが5秒以内の場合は常に同じ測定値に属するため、指定されたタイムスタンプのリストから、開始と停止がいつ発生したかを簡単に判断できます。
今、私はこのデータから次のようなリストを取得したいと思います:
DeviceID Started Ended
Device1 1.1.2011 10:00:00 1.1.2011 10:00:05
Device1 1.1.2011 14:23:14 1.1.2011 14:23:18
では、これをすばやく行う方法はありますか?私が考えることができるのは、ある種のカーソルを使用して、各日時のペアを手動で比較することだけです。しかし、各行の各値を検査する必要があるため、これは非常に遅くなると思います。
では、カーソルで機能しないより良いSQLソリューションはありますか?
アップデート
現在、私は与えられたすべての答えをテストしました。そして、読むことによって、それらはすべて見栄えがよく、いくつかの興味深いアプローチがありました。残念ながら、それらすべて(これまでのところ)は実際のデータで失敗しました。最大の問題はデータの量にあるようです(現在、それらはテーブル内の約350万のエントリです)。小さなサブセットに対してのみ特定のクエリを実行すると、期待される結果が得られますが、テーブル全体にクエリをロールすると、パフォーマンスが非常に悪くなります。
データをチャンク化して、データの一部のみをこれらの指定されたアルゴリズムの1つに渡して、この処理を実行できるかどうかをさらにテストして調べる必要があります。しかし、おそらくあなたの1人は、結果をもう少し速く取得するための別の賢いアイデアを持っています。
更新(構造に関する詳細情報)
さて、これらの情報も役立つかもしれません:現在、テーブルには約350万のエントリがあります。そして、ここに与えられた列タイプと表示があります:
- _ID
- int
- 主キー
- グループ化されたインデックス
- 私の例ではこの列について言及していません。このクエリには必要ないためです。
- デバイスID
- int
- nullではない
- 索引
- タイムスタンプ
- 日付時刻
- nullではない
- 索引
- 価値
- 異なるタイプ(int、real、tinyint)のいくつかのインデックス付けされていない列
- すべてnullにすることができます
たぶん、これは与えられた問題に対するあなたのすでに(または新しい)解決策を改善するのに役立ちます。