2017-11-25 5 views
1

PostgreSQLクエリのヘルプ/ポインタが必要です。私は、システムからのイベントPostgresのスライスデータセットのSQLクエリ

イベントを持つテーブルがあります。この表から

id|   tstamp |device_type 
----------------------------------- 
1 |2017-10-01 00:00:00|mobile 
2 |2017-10-01 00:00:10|mobile 
3 |2017-10-01 00:00:20|mobile 
4 |2017-10-01 00:10:10|mobile 
5 |2017-10-01 00:10:20|mobile 

を、私は今の行

id| tstamp  |device_type|lag_in_sec 
----------------------------------- 
1 |2017-10-01 00:00:00|mobile  | 
2 |2017-10-01 00:00:10|mobile  | 10 
3 |2017-10-01 00:00:20|mobile  | 10 
4 |2017-10-01 00:10:20|mobile  | 600 
5 |2017-10-01 00:10:30|mobile  | 10 

間のタイムラグを導き出すことができ、私が上でこのテーブルをスライスしたいと思います60より大きい場合はラグに基づいて、スライスでは最小および最大のスタンプを取得します。この場合、私は以下の出力を導出しようとしています

min_tstamp   |  max_tstamp 
---------------------------------------- 
2017-10-01 00:00:00 | 2017-10-01 00:00:20 
2017-10-01 00:10:20 | 2017-10-01 00:10:30 

これを達成するためのあらゆる指針は非常に高く評価されます。

ありがとうございました!

答えて

1

アイデアはこのように、CASE式、サブクエリとSUM over解析関数を使用してlag_in_sec値に基づいてグループにレコードを分割することである。

SELECT tstamp, 
     SUM(CASE WHEN lag_in_sec >= interval '60' second THEN 1 ELSE 0 END) 
     OVER (order by tstamp) as group_number 
FROM ( 
    SELECT *, tstamp - lag(tstamp) Over (order by tstamp) as lag_in_sec 
    FROM Table1234 
) x; 

+----------------------+---------------+ 
|  tstamp  | ,group_number | 
+----------------------+---------------+ 
| 2017-10-01 00:00:00, |    0 | 
| 2017-10-01 00:00:10, |    0 | 
| 2017-10-01 00:00:20, |    0 | 
| 2017-10-01 00:10:10, |    1 | 
| 2017-10-01 00:10:20, |    1 | 
+----------------------+---------------+ 

広告単純なグループを実行上記のクエリの結果に-BYクエリ、MINとMAX関数を使用して:

SELECT min(tstamp) as min_tstamp, 
     max(tstamp) as max_tstamp 
FROM (
    SELECT tstamp, 
      SUM(CASE WHEN lag_in_sec >= interval '60' second THEN 1 ELSE 0 END) 
      OVER (order by tstamp) as group_number 
    FROM ( 
     SELECT *, tstamp - lag(tstamp) Over (order by tstamp) as lag_in_sec 
     FROM Table1234 
    ) x 
) y 
GROUP BY group_number 
ORDER BY 1 

+----------------------+---------------------+ 
|  min_tstamp,  |  max_tstamp  | 
+----------------------+---------------------+ 
| 2017-10-01 00:00:00, | 2017-10-01 00:00:20 | 
| 2017-10-01 00:10:10, | 2017-10-01 00:10:20 | 
+----------------------+---------------------+ 

ライブデモ:DBFiddle link