Postgres查询 - 计算最繁忙的1小时时段

时间:2018-04-30 09:03:28

标签: sql postgresql

我有一张记录机场航班的表格,每个航班有一行,并包含一个时间戳字段takeOffTime。

我想找到最繁忙的1小时滚动窗口。我的第一次尝试看起来像这样......。

select count(*), date_trunc('hour', takeOffTime) 
from flight 
group by date_trunc('hour', takeOffTime)
order by 2

然而,这里有一个很大的问题。我可以使用上面的内容来发现最繁忙的日历时间,即从一小时标记到下一小时标记的最繁忙时间。

我真正想要的是找到最繁忙的1小时滚动窗口。例如,对于我的一个数据集,我知道最繁忙的日历时间是从早上11点到早上12点,但是我也知道(使用铅笔和纸)在同一天最繁忙的滚动1小时窗口是从11:13:48到12点13分48秒。如何编写SQL查询来给我这个答案?

由于

数据和示例......

DROP TABLE flight;

CREATE TABLE flight (takeoffTime timestamp);

INSERT INTO flight VALUES
('2018-04-28 12:05'), 
('2018-04-28 13:05'), 
('2018-04-28 14:01'), 
('2018-04-28 15:05'), 
('2018-04-28 16:05');

运行我的原始查询...

select count(*), date_trunc('hour', takeOffTime) 
from flight 
group by date_trunc('hour', takeOffTime)
order by 2;

它会告诉你每小时有一个航班。但是,仔细查看实际数据,你可以看到最繁忙的1小时时间实际上是在13:05到14:05之间,当有两个航班时 - 正如戈登回答的那样。

1 个答案:

答案 0 :(得分:1)

一种方法是使用自联接和聚合:

select f.takeOffTime, count(*) as cnt
from flight f join
     flight f2
     on f2.takeOffTime >= f.takeOffTime and
        f2.takeOffTime < f.takeOffTime + interval '1 hour'
group by f.takeOffTime
order by 2 desc
limit 1;

这不是非常有效。