SQL与两个时间戳对相交,并按小时分组

问题描述 投票:0回答:1

我有点问题。

我有一个表让我们称之为“事件”列,如:type,(1或0),timestamp start,timestamp end。

我想按小时(60分钟)将它们分组为4列,每列计算

  1. 每小时多少分钟没有类型1或类型0事件。
  2. 每小时多少分钟有一个事件类型1,同时没有类型2的事件。
  3. 每小时有多少分钟有一个事件类型2,同时没有类型1的事件
  4. 每小时多少分钟同时有一个事件2和事件1。

结果应如下所示:

小时00 10 01 11

12 10 20 20 10

13 5 15 25 15

每行应总是60分钟。

是否可以在SQL中执行此操作?我在vertica中需要它,所以我也可以使用verticas函数。

sql vertica
1个回答
0
投票

有趣的问题!这是一个可以满足您需求的查询。我模拟了下表和一些虚拟数据,然后在最后显示了查询的结果。根据您的要求 - 总计每小时总计最多60分钟。

建立:

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;

查询:

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
© www.soinside.com 2019 - 2024. All rights reserved.