【问题标题】:Aggregating time sequences in psql在 psql 中聚合时间序列
【发布时间】:2018-08-09 19:52:20
【问题描述】:

我是 psql 窗口函数的新手,我想对 test_table 执行查询,以便找出每个 mobile_idcountry 和 @987654324 的非活动中断实例@ 以及中断的持续时间(以秒为单位)。

应将每次中断视为一个单独的事件,换句话说,当按时间排序时,active 行的出现应重置计数。 如果只有一个独立的“非活动”记录,则不能有 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

查询test_table 会产生如下结果:

> outages
  id country brand diff_time
1  1      dk nokia       614
2  2      dk nokia       596
3  3      dk apple        60

如何构建这样的查询?

【问题讨论】:

    标签: sql postgresql psql window-functions


    【解决方案1】:

    您可以通过对它们之前的活动进行总和来识别非活动组。剩下的基本上就是聚合了:

    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 的结果 - 它不需要中断持续时间
    • @the_darkside 。 . .由于least(),此查询无法生成0
    猜你喜欢
    • 2018-05-18
    • 2015-05-28
    • 2015-10-11
    • 2023-03-07
    • 2011-04-28
    • 1970-01-01
    • 2016-02-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多