[英]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_id
的AVG
,然后比较每个航空公司的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.