postgresql 按航空公司代码列出的前3大航班延误(> 1小时)百分比(列表)

twh00eeo  于 2024-01-07  发布在  PostgreSQL
关注(0)|答案(1)|浏览(136)

我试图获得前3名最延迟的公司按百分比(超过一个小时)。
下面是一个表的例子(ARR_DELAY是以分钟为单位,也意味着他们提前到达):
| 航空公司代码|到达_延迟|
| --|--|
| DL|-6个|
| DL| 123 |
| DL|四十七|
| DL| 32 |
也有独特的航空公司代码,但他们重复了很多(因为它每天发生)“AIRLINE_CODE”,“9 E”,“AA”,“AS”,“B6”,“DL”

Here is a code I have so far:
SELECT "ninteen_Flights"."AIRLINE_CODE",
100.0 * "ninteen_Flights"."ARR_DELAY" / sum("ninteen_Flights"."ARR_DELAY") OVER (PARTITION BY "ninteen_Flights"."AIRLINE_CODE") AS avg
FROM "ninteen_Flights"
GROUP BY "ninteen_Flights"."AIRLINE_CODE"

字符串
我知道代码是错误的。但是,我不知道如何得到我需要的结果.
我试图获得前3名最延迟的公司按百分比(超过一个小时)。

yhqotfr8

yhqotfr81#

对于这一点,你不需要使用窗口查询,你可以用一个简单的GROUP BY来做到这一点。“most delayed”这个术语通常意味着我们询问的是延迟的 * 频率 *,而不是具体的累积或平均延迟,如果他们想要的话,他们会问的。
我怀疑你真正想要的是:

**最常延误航班的前三家航空公司,其中延误超过1小时。

为此,我们实际上不会计算总的累积延误或类似的东西,我们只需要航班的数量,为此,我们可以使用CASE语句将数据投影到两组列中,我们可以比较:

**注意:**在其他RDBMS(如SQL Server)中,我们可以对NULL值使用一些技巧来简化这种类型的逻辑,但在PostgreSQL COUNT()中,计数 * 所有 * 行,包括NULL s。因此,我们将不使用NULL,而是使用SUM()和1和0

  • 虽然没有必要这样做,但我们可以将其表示为百分比 *
SELECT "ninteen_Flights"."AIRLINE_CODE",
    100.0 * 
    SUM(CASE 
            WHEN "ninteen_Flights"."ARR_DELAY" > 60 THEN 1
            ELSE 0
        END) / 
    COUNT(*) AS "AVG_DELAYED"
FROM "ninteen_Flights"
GROUP BY "ninteen_Flights"."AIRLINE_CODE"
ORDER BY "AVG_DELAYED" DESC
LIMIT 3

字符串
小提琴:http://sqlfiddle.com/#!17/8 f4 e4/5

相关问题