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