Sql 超过两列的Postgres where子句

Sql 超过两列的Postgres where子句,sql,postgresql,subquery,where-clause,Sql,Postgresql,Subquery,Where Clause,数据库-我正在研究Postgres 9.6.5 我正在分析美国机场管理局丽塔提供的有关航班到达和起飞的数据。 此链接列出表中的所有列 该表有以下29列 无名称描述 1年1987-2008 2个月1-12 3月1日至31日 每周4天1周一至7周日 5 DepTime本地实际出发时间,hhmm 6小时预定出发时间当地时间,hhmm 7到达时间当地实际到达时间,hhmm 8 C到达时间本地预定到达时间,hhmm 9唯一承运人唯一承运人代码 10 FlightNum航班号 11 TailNum飞机尾号

数据库-我正在研究Postgres 9.6.5

我正在分析美国机场管理局丽塔提供的有关航班到达和起飞的数据。 此链接列出表中的所有列

该表有以下29列

无名称描述

1年1987-2008

2个月1-12

3月1日至31日

每周4天1周一至7周日

5 DepTime本地实际出发时间,hhmm

6小时预定出发时间当地时间,hhmm

7到达时间当地实际到达时间,hhmm

8 C到达时间本地预定到达时间,hhmm

9唯一承运人唯一承运人代码

10 FlightNum航班号

11 TailNum飞机尾号

12实际最短时间(分钟)

13秒延时(分钟)

14分钟广播时间

15延迟到达延迟,以分钟为单位

16延迟起飞延迟,以分钟为单位

17国际航空运输协会机场代码

18目的地国际航空运输协会机场代码

19英里的距离

20辆出租车在时间上,在分钟内

21滑行滑行时间(分钟)

航班取消了吗

23取消代码取消原因A=承运人,B=天气,C=北美,D=安全

24.1=是,0=否

25分钟的运输延迟

26分钟延迟

延迟27分钟

28安全延迟(分钟)

29晚点飞机延误分钟

每年大约有一百万行

我正试图找出一个最繁忙的机场时,延误超过15分钟的计数。 column DepDelay-具有延迟时间。 始发地-是机场的始发地代码

所有数据都已加载到名为“ontime”的表中

我将分阶段提出以下问题

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

从ontime中选择来源、年份、计数*作为depdelay\u计数 哪里 深度延迟>15 按年份分组,来源 按depdelay\u计数说明订购

现在,我希望每年只撤出前10个机场——我的做法如下

选择x.origin,x.year from,子查询为 从ontime中选择来源、年份、计数*作为depdelay\u计数 哪里 深度延迟>15 按年份分组,来源 按depdelay\u计数说明订购 从子查询x中选择原点、年份、按分区按年份排序按DEPDLAY排序\u count desc作为秩,其中x.rank 15 按年份分组,来源 按depdelay\u计数说明订购
从子查询x中选择origin、year、rank over partition by year order by depdelay\u count desc作为秩,其中x.rank我发现查询中间的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 . . . 谢谢。是的,添加了逗号,效果很好。非常感谢。
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;