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

时间:2016-12-07 12:07:42

标签: sql vertica

我有点问题。

我有一个表,我们可以使用以下列来调用它“事件”:类型,(1或0),时间戳开始,时间戳结束。

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

  1. 每小时多少分钟,没有类型1或类型0事件。

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

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

  4. 每小时有多少分钟同时有一个事件2和事件1.

  5. 结果应如下所示:

    小时00 10 01 11

    12 10 20 20 10

    13 5 15 25 15

    每一行总是应该总计60分钟。

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

1 个答案:

答案 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