Postgres中切片数据集的SQL查询

Postgres中切片数据集的SQL查询,sql,postgresql,Sql,Postgresql,需要一些PostgreSQL查询的帮助/指针。我有一个包含系统事件的表 活动: 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

需要一些PostgreSQL查询的帮助/指针。我有一个包含系统事件的表

活动:

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,则得到切片中的最小和最大tstamp。在本例中,我试图导出以下输出

 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
如有任何能达到此目的的建议,我们将不胜感激


谢谢大家!

这个想法是使用一个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 |
+----------------------+---------------+

ad然后使用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 |
+----------------------+---------------------+
现场演示: