【发布时间】:2018-03-07 14:23:47
【问题描述】:
数据库 - 我正在使用 Postgres 9.6.5
我正在分析来自美国机场管理局 (RITA) 的有关航班进出港的数据。 此链接 (http://stat-computing.org/dataexpo/2009/the-data.html) 列出了表中的所有列。
该表有以下 29 列
无名称说明
1987-2008 年
2 个月 1-12
3 DayofMonth 1-31
4 DayOfWeek 1(星期一)- 7(星期日)
5 DepTime 实际出发时间(本地,hhmm)
6 CRSDepTime 计划出发时间(本地,hhmm)
7 ArrTime 实际到达时间(本地,hhmm)
8 CRSArrTime 预定到达时间(本地,hhmm)
9 UniqueCarrier 唯一运营商代码
10 FlightNum 航班号
11 TailNum 平面尾号
12 ActualElapsedTime 以分钟为单位
13 CRSElapsedTime 以分钟为单位
14 分钟通话时间
15 ArrDelay 到达延迟,以分钟为单位
16 DepDelay 出发延误,以分钟为单位
17 始发地IATA机场代码
18 目的地国际航空运输协会机场代码
19 距离(英里)
20 TaxiIn 出租车及时,以分钟计
21 TaxiOut 打车时间(以分钟为单位)
22 Canceled 航班取消了吗?
23 CancellationCode 取消原因(A = 运营商,B = 天气,C = NAS,D = 安全)
24 分流 1 = 是,0 = 否
25 分钟载波延迟
26 分钟的 WeatherDelay
27 NASDelay(分钟)
28 分钟安全延迟
29 LateAircraftDelay 以分钟为单位
每年大约有一百万行。
我试图找出延误超过 15 分钟时最繁忙的机场。 列 DepDelay - 具有延迟时间。 origin - 是机场的起始代码。
所有数据都已加载到名为“ontime”的表中
我正在逐步形成如下查询。
-
选择延误超过 15 分钟的机场
从 ontime 中选择 origin,year,count(*) 作为 depdelay_count 在哪里 延迟 > 15
按年份分组,来源 按 depdelay_count desc 排序 ) -
现在我希望只提取每年排名前 10 的机场 - 我正在这样做
select x.origin,x.year from (子查询为 ( 从 ontime 中选择 origin,year,count(*) 作为 depdelay_count 在哪里 延迟 > 15 按年份分组,来源 按 depdelay_count desc 排序 ) 选择 origin,year,rank() over (partition by year order by depdelay_count desc) 作为子查询的排名) x where x.rank
-
现在我已经获得了 depdelay 排名前 10 的机场 - 我希望计算从这些机场起飞的航班总数。
select origin,count() from ontime where origin in (select x.origin from (with subquery as ( 从 ontime 中选择 origin,year,count() 作为 depdelay_count 在哪里 延迟 > 15 按年份分组,来源 按 depdelay_count desc 排序 ) 选择 origin,year,rank() over (partition by year order by depdelay_count desc) 作为子查询的排名) x 其中 x.rank
如果我通过在 year 子句中添加年份来修改步骤 3 查询
---- 将是(1987 年到 2008 年)之间的任何值
select origin,count(*) from ontime where year = (<YEAR>) origin in
(select x.origin from (with subquery as (
select origin,year,count(*) as depdelay_count from ontime
where
depdelay > 15
group by year,origin
order by depdelay_count desc
)
select origin,year,rank() over (partition by year order by depdelay_count desc) as rank from subquery) x where x.rank <= 2)
group by origin
order by origin;
但我必须在 1987 年到 2008 年的所有年份中手动执行此操作,这是我想避免的。
请您帮助优化查询,以便我可以选择所有年份的数据,而无需手动选择每一年。
【问题讨论】:
标签: sql postgresql subquery where-clause