【问题标题】:Postgres where clause over two columnsPostgres where子句超过两列
【发布时间】: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”的表中

我正在逐步形成如下查询。

  1. 选择延误超过 15 分钟的机场

    从 ontime 中选择 origin,year,count(*) 作为 depdelay_count 在哪里 延迟 > 15
    按年份分组,来源 按 depdelay_count desc 排序 )

  2. 现在我希望只提取每年排名前 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

  3. 现在我已经获得了 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


    【解决方案1】:

    我发现 CTE 位于查询的中间,令人困惑。您基本上可以使用一个 CTE/子查询来做到这一点:

    with oy as (
          select origin, year, count(*) as numflights,
                 sum( (depdelay > 15)::int ) as depdelay_count,
                 row_number() over (partition by year order by sum( (depdelay > 15)::int ) desc) as seqnum
          from ontime
          group by origin, year
         ) 
    select oy.*
    from oy
    where seqnum <= 10;
    

    注意条件聚合的使用以及将窗口函数与聚合函数一起使用。

    【讨论】:

    • 嗨,戈登 - 感谢您的回复,我同意中间的 CTE 令人困惑。我分阶段构建查询,所以我按原样使用 CTE。您的查询在 flightdata_info-> where seqnum 15)::int ) as depdelay_count, ^ flightdata_info=> 同时,我正在查看查询以了解其编写方式并计算出什么错误指向
    • numflights后面少了一个逗号
    • @AndyNichols。 . .谢谢。
    • 是的,添加了逗号并且可以无缝运行。非常感谢。
    猜你喜欢
    • 2018-03-06
    • 2020-09-12
    • 1970-01-01
    • 2014-04-04
    • 2020-04-12
    • 1970-01-01
    • 2021-07-06
    • 2021-05-10
    • 1970-01-01
    相关资源
    最近更新 更多