Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
psql中的时间序列聚合_Sql_Postgresql_Psql_Window Functions - Fatal编程技术网

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

我不熟悉psql窗口功能,希望对
测试表
执行查询,以找出每个
移动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