Я практикую SQL, и у меня есть стол с именем flights
, в котором есть рейс id
, origin
, destination
и cost
поездки. Я хочу, чтобы можно было найти все самые дешевые рейсы, которые можно выполнить за две или менее остановки, а также указать, сколько остановок имеет каждый рейс, а также общую стоимость полета. Кроме того, если две поездки стоят одинаково, я хочу одну с наименьшим количеством остановок.
Вот таблица на db-fiddle: https://www.db-fiddle.com/f/mvvE24KAxnayR9fRmHChMw/1
Это это то, что я имею до сих пор, и это не завершено, так как мне не хватает количества остановок и некоторых рейсов. Я не уверен, как подсчитать количество остановок между рейсами или как получить все стыковочные рейсы.
Мне кажется, что это можно сделать без рекурсивного CTE, но я не уверен. Я также чувствую, что мой запрос очень грязный. Любая помощь будет полезна!
Спасибо!
Запрос:
WITH RECURSIVE connecting_flights AS (
SELECT origin, destination, cost
FROM flights
UNION ALL
SELECT f.origin, f.destination, cf.cost
FROM flights f
INNER JOIN connecting_flights cf ON cf.origin = f.destination
), flight_data as (
SELECT
DISTINCT flights.origin as original_flight
, flights.destination as original_destination
, flights.cost as flights_cost
, cf.origin as cf_origin
, cf.destination as cf_destination
,cf.cost as cf_cost
, flights.cost + cf.cost as total_cost
FROM flights
LEFT JOIN connecting_flights cf ON cf.origin = flights.destination
LEFT JOIN flights b ON b.origin = cf.origin
)
SELECT
original_flight
, CASE
WHEN cf_destination IS NULL THEN original_destination
ELSE cf_destination
END as destination
, CASE
WHEN cf_destination IS NULL THEN flights_cost
ELSE total_cost
END as total
FROM flight_data
ORDER BY original_flight