繁体   English   中英

获得所需 SQL 结果的指南

[英]Guidance on getting desired SQL results

感谢对我最后一个问题的帮助,我现在有最后一步来完全掌握这种查询我的问题的方法。

鉴于这两个表:

airlines_detail

飞机编号 航空公司_id 总座位数
2187 425 260
4361 747 290
3478 747 270
7292 425 250
5833 425 310
3472 425 300
4472 747 290
2624 425 320

Bookings

飞机编号 预订
2187 40
4361 30
4361 10
5833 30
4361 30
2624 30
4472 40
4472 40
2624 10
7292 20
2187 20
4472 30
3478 20
3472 40
4472 30
4472 10
4361 20
3478 30
2187 30
2187 10

我需要得到这个结果:

航空公司_id 飞机
425 7292
747 4361

结果是aircraft_id,其airplane_id座位的SUM最接近每个airline_id的空座位的AVG数(在这种情况下,只有425 和747 需要担心)。

因此,我们需要找到SUM(empty_seats) GROUP BY airline_idAVG ,然后比较每个航空公司的SUM(empty_seats) GROUP BY airplane_id ,并返回一个表格,其中显示最接近各自航空公司平均空载的飞机座位。

对于 ID 为 425 的航空公司,空座位的平均数量为 242。因此,最接近该平均值的飞机是 7292。

配备了上一个问题的答案,即获得每架飞机的空座位总和,我希望下一步对于大师来说是一个简单的步骤。

您将从您拥有的查询开始,然后将其用作中间结果来获得每家航空公司的平均值,然后根据空座位数与航空公司平均值的偏差程度对飞机进行排名。 对于该排名,您可以使用ROW_NUMBER()和窗口子句 ( OVER )。 最后,select 该结果中排名第一的行。

对于这个基于先前结果的构建链,使用WITH语法很方便:

WITH base as (
    SELECT
        a.airplane_id,
        a.airline_id,
        a.total_seats - SUM(b.booked) AS empty_seats
    FROM
        airlines_detail a
    LEFT JOIN bookings b
        ON
            a.airplane_id = b.airplane_id
    GROUP BY  
        a.airplane_id,
        a.airline_id
), average as (
    SELECT
        airline_id,
        AVG(empty_seats) avg_empty_seats
    FROM
        base
    GROUP BY
        airline_id
), ranked as (
    SELECT
        b.airplane_id,
        b.airline_id,
        ROW_NUMBER() OVER (
            PARTITION BY b.airline_id 
            ORDER BY ABS(b.empty_seats - a.avg_empty_seats)
        ) rn
    FROM
        base b
    INNER JOIN average a
        ON
            a.airline_id = b.airline_id
)
SELECT
    airline_id,
    airplane_id
FROM
    ranked
WHERE
    rn = 1;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM