psql中的时间序列聚合
我不熟悉psql窗口功能,希望对psql中的时间序列聚合,sql,postgresql,psql,window-functions,Sql,Postgresql,Psql,Window Functions,我不熟悉psql窗口功能,希望对测试表执行查询,以找出每个移动id、国家、和品牌的非活动停机实例以及停机持续时间(秒) 每次停机都应被视为一个单独的事件,换句话说,当按时间排序时,活动行的出现应重置计数。 如果只有一条独立的“非活动”记录,则不能有difftime,这些情况应指定默认值60 例如: > test_table mobile_id state country brand time 1 1a inactive d
测试表
执行查询,以找出每个移动id
、国家
、和品牌
的非活动停机实例以及停机持续时间(秒)
每次停机都应被视为一个单独的事件,换句话说,当按时间排序时,活动
行的出现应重置计数。
如果只有一条独立的“非活动”记录,则不能有difftime
,这些情况应指定默认值60
例如:
> test_table
mobile_id state country brand time
1 1a inactive dk nokia 2018-08-09 19:01:53
2 1a inactive dk nokia 2018-08-09 18:51:39
3 1a active dk nokia 2018-08-09 18:42:10
4 1a inactive dk nokia 2018-08-09 18:31:23
5 1a inactive dk nokia 2018-08-09 18:21:27
6 2a active dk apple 2018-08-09 18:12:08
7 2a active dk apple 2018-08-09 18:01:45
8 2a active dk apple 2018-08-09 17:51:29
9 2a active dk apple 2018-08-09 17:41:27
10 2a inactive dk apple 2018-08-09 17:31:32
11 3a active de nokia 2018-08-09 17:21:34
12 3a active de nokia 2018-08-09 17:11:48
13 3a active de nokia 2018-08-09 17:01:46
14 3a active de nokia 2018-08-09 16:51:31
15 3a active de nokia 2018-08-09 16:41:34
查询测试表将产生如下结果:
> outages
id country brand diff_time
1 1 dk nokia 614
2 2 dk nokia 596
3 3 dk apple 60
如何构造这样一个查询?您可以通过获取前面活动的总和来识别非活动组。剩下的基本上是聚合:
select mobile_id, brand, country,
least(extract(epoch from max(time) - min(time)), 60) as diff
from (select t.*,
count(*) filter (where state = 'active') over (partition by mobile_id, brand, country order by time) as grp
from t
) t
group by mobile_id, brand, country, grp;
不幸的是,这只会产生一个差值为0或60的结果-它不需要整个过程的持续时间outages@the_darkside . . . 由于least()
,此查询无法生成0
。