我有一张记录机场航班的表格,每个航班有一行,并包含一个时间戳字段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之间,当有两个航班时 - 正如戈登回答的那样。
答案 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;
这不是非常有效。