postgresql - 按航空公司代码列出的前 3 个延误最多的航类(>1 小时)百分比(列表)

标签 postgresql

我正在尝试按百分比(延迟超过一个小时)列出前 3 名最严重的公司。

这是一个表格示例(ARR_DELAY 以分钟为单位,也意味着他们提前到达):

<表类=“s-表”> <标题> AIRLINE_CODE ARR_DELAY <正文> 深度学习 -6 深度学习 123 深度学习 -47 深度学习 32

也有独特的航空公司代码,但它们经常重复(因为每天都会发生) “AIRLINE_CODE”、“9E”、“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 名最严重的公司。

最佳答案

为此,您不需要使用窗口查询,您可以使用简单的GROUP BY来完成此操作。通过术语“最延迟”,这通常意味着我们询问的是延迟的频率,而不是具体的累积或平均延迟,如果他们希望的话问道。对这一思路的最终支持是附加标准:超过一个小时

我怀疑您真正要求的是:
航类延误最频繁的前 3 家航空公司,延误时间超过 1 小时。

为此,我们实际上不会计算总累积延误或类似的内容,我们只需要航类数量,为此,我们可以使用 CASE 语句将数据投影为 2我们可以比较的列集:

NOTE: In other RDBMS like SQL Server, we can use some tricks with NULL values to simplify this type of logic, but in PostgreSQL COUNT() counts all rows, including NULLs. So instead of using NULL we will use SUM() with 1s and 0s

虽然没有必要这样做,但我们可以将其表示为百分比

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

fiddle :http://sqlfiddle.com/#!17/8f4e4/5

关于postgresql - 按航空公司代码列出的前 3 个延误最多的航类(>1 小时)百分比(列表),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77730619/

相关文章:

ruby - 使用不带导轨的 ActiveRecord 连接到现有的 Postgresql 数据库

ruby-on-rails - 在 Heroku 中将 Postgresql 连接到 Rails

sql - 了解 Rails + postgresql 中的随机排序

sql - 在 Postgres 中查询 JSONB 中的复杂数组

django - settings.DATABASES 配置不当

php - OOP PhP 类的空属性问题,当它们插入数据库时​​它们不为空。数据库

arrays - 在 Postgres 数组中排序有多可靠?

mysql - postgreSQL mysql oracle 差异

arrays - postgres array_agg 错误 : cannot accumulate arrays of different dimensionality

linux - 如何打印特定模式下表中的总行数?