我有点问题。
我有一个表,我们可以使用以下列来调用它“事件”:类型,(1或0),时间戳开始,时间戳结束。
我想按小时(60分钟)分组 分为4列,每列计算
每小时多少分钟,没有类型1或类型0事件。
每小时有多少分钟有一个事件类型1,同时没有类型2的事件。
每小时有多少分钟有一个事件类型2,同时没有类型1的事件
每小时有多少分钟同时有一个事件2和事件1.
结果应如下所示:
小时00 10 01 11
12 10 20 20 10
13 5 15 25 15
每一行总是应该总计60分钟。
是否可以在SQL中执行此操作?我在vertica中需要它,所以我也可以使用verticas函数。
答案 0 :(得分:0)
有趣的问题!这是一个可以满足您需求的查询。我模拟了下表和一些虚拟数据,然后在最后显示了查询的结果。根据您的要求 - 总计每小时总计最多60分钟。
SETUP:
create table public.time_event_test(event_timestamp timestamptz, event_type int);
insert into public.time_event_test(event_timestamp,event_type) select getutcdate() as event_timestamp, 1 as event_type;
insert into public.time_event_test(event_timestamp,event_type) select TIMESTAMPADD('minute',5,getutcdate()) as event_timestamp, 1 as event_type;
insert into public.time_event_test(event_timestamp,event_type) select TIMESTAMPADD('minute',1,getutcdate()) as event_timestamp, 1 as event_type;
insert into public.time_event_test(event_timestamp,event_type) select TIMESTAMPADD('minute',1,getutcdate()) as event_timestamp, 2 as event_type;
insert into public.time_event_test(event_timestamp,event_type) select TIMESTAMPADD('minute',3,getutcdate()) as event_timestamp, 2 as event_type;
insert into public.time_event_test(event_timestamp,event_type) select TIMESTAMPADD('minute',6,getutcdate()) as event_timestamp, 2 as event_type;
insert into public.time_event_test(event_timestamp,event_type) select TIMESTAMPADD('minute',90,getutcdate()) as event_timestamp, 2 as event_type;
QUERY:
select date_trunc('hour',dat) as hr
, 60 - sum(case when event_type1 = 1 or event_type2 = 1 then 1 else 0 end) as type_00
, sum(case when event_type1 = 0 and event_type2 = 1 then 1 else 0 end) as type_01
, sum(case when event_type1 = 1 and event_type2 = 0 then 1 else 0 end) as type_10
, sum(case when event_type1 = 1 and event_type2 = 1 then 1 else 0 end) as type_11
from (
select date_trunc('minute',event_timestamp) as dat
, max(case when event_type = 1 then 1 else 0 end) as event_type1
, max(case when event_type = 2 then 1 else 0 end) as event_type2
from public.time_event_test
group by 1
) x
group by 1 order by 1;
结果:
hr | type_00 | type_01 | type_10 | type_11
------------------------+---------+---------+---------+---------
2016-12-21 01:00:00+00 | 52 | 3 | 2 | 3
2016-12-21 02:00:00+00 | 59 | 1 | 0 | 0