在psql中汇总时间序列

时间:2018-08-09 19:52:20

标签: sql postgresql psql window-functions

我是psql窗口函数的新手,想对test_table执行查询,以便找出每个mobile_id,{{1 }},country和中断时间(以秒为单位)。

每个中断应被视为一个单独的事件,换句话说,按时间排序时,出现brand行应重置该计数。 如果只有一个独立的“非活动”记录,则不会有active,并且应该为这些情况指定默认值60。

例如:

difftime

查询> 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 将产生如下结果:

test_table

如何构造这样的查询?

1 个答案:

答案 0 :(得分:0)

您可以通过获取非活动组的总和来确定非活动组。其余的基本上就是聚合:

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;