我每隔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中编写此查询?
答案 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分钟间隔。