按时间间隔计算每组的变量

时间:2017-12-04 05:40:31

标签: sql postgresql aggregate

我每隔10分钟收集一批车辆的数据。以下查询按预期返回144行(一天中10分钟的间隔数)。

  select distinct(date_trunc('minute', (((time::timestamp) AT TIME ZONE 'UTC') AT TIME ZONE 'EST'))) FROM fleet_history WHERE (((time::timestamp) AT TIME ZONE 'UTC') AT TIME ZONE 'EST') BETWEEN '2017-11-30 00:00:00'::timestamp AND '2017-11-30 23:59:59'::timestamp ORDER BY date_trunc DESC

在表格fleet_history中,还有另一列名为repair_state的列 - 一个字符列,其中包含车辆是否工作的说明"或者"在修理"或"其他"。

select * FROM fleet_history limit 5

  id repair_state                time
1  1      working 2017-11-22 15:45:34
2  2    in repair 2017-11-22 15:45:34
3  3      working 2017-11-22 15:45:34
4  4      working 2017-11-22 15:45:34
5  5        other 2017-11-22 15:45:34

我的目标是,每隔10分钟,在修理车辆和其他车辆中输出截断时间和工作车辆的数量(计数)(按间隔分组)。

如何在PostgreSQL中编写此查询?

1 个答案:

答案 0 :(得分:1)

一种方法创建一个CTE日历表,其中包含给定日期的十分钟间隔。然后将此日历表连接到您的fleet_history表,条件是时间在给定的十分钟​​间隔内。最后,对每个间隔进行条件聚合,并计算各种类型的修复状态。

with calendar as (
    select i from generate_series('2017-11-22', 
    '2017-11-23', '10 minute'::interval) i
)

select
    t1.i,
    sum(case when t2.repair_state = 'working'   then 1 else 0 end) as working_cnt,
    sum(case when t2.repair_state = 'in repair' then 1 else 0 end) as repair_cnt,
    sum(case when t2.repair_state = 'other'     then 1 else 0 end) as other_cnt
from calendar t1
left join fleet_history t2
    on t2.time >= t1.i and t2.time < t1.i + INTERVAL '10 min'
group by
    t1.i
order by
    t1.i;

按照以下链接进行正在运行的演示。这有点人为,因为您的样本数据仅包含5条记录,所有记录都来自相同的10分钟间隔。

Demo