Найти источник и конечный пункт назначения с помощью sql

У меня есть таблица source_flight_destination, подобная этой

ИДЕНТИФИКАТОР Полет источник место назначения 1 Индиго II ББ 2 Эйр Азия АА II 3 Индиго ББ ДжейДжей 4 струя специй SS ББ 5 Индиго ДжейДжей SS 6 Эйр Азия II КК 7 струя специй ББ ДжейДжей

Вывод должен быть таким: рейс, источник и пункт назначения.

полет источник место назначения Эйр Азия АА КК Индиго II SS Спайсджет SS ДжейДжей

Я придумал рабочее решение:

with ranked as (
    select *,
    row_number() over (partition by flight order by id asc) as rn
    from source_destination_flight
),
minima as (
    select flight, min(rn) as minrn from ranked group by flight ),
maxima as (
    select flight, max(rn) as maxrn from ranked group by flight),
sourced as (
        select 
              r.flight, 
              r.source as source 
        from ranked r 
        join minima m1 on m1.flight=r.flight and m1.minrn=r.rn
),
destination as (
     select 
           r1.flight, 
           r1.destination as destination 
     from ranked r1 
     join maxima m2 
     on m2.flight=r1.flight and m2.maxrn=r1.rn
)
select
    s.flight, s.source, d.destination from sourced s join destination d on s.flight=d.flight

Идея заключалась в следующем:

  • дать row_number(), сгруппированный по рейсу как раздел,
  • найти минимумы и максимумы row_number для каждого раздела,
  • выберите источник и место назначения путем фильтрации на основе минимумов и максимумов.

Тем не менее, это решение выглядит совершенно уродливым, и я уверен, что есть гораздо более простое решение.

Может ли кто-нибудь дать мне указания?

Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
2
0
51
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Для этого примера данных вы можете использовать оконную функцию FIRST_VALUE():

SELECT DISTINCT Flight,
       FIRST_VALUE(source) OVER (PARTITION BY Flight ORDER BY ID) AS source,
       FIRST_VALUE(destination) OVER (PARTITION BY Flight ORDER BY ID DESC) AS destination
FROM source_destination_flight;

Смотрите демо.

Если я правильно понял, что вы пытаетесь сделать, принимая первую строку Flight за источник и последнюю за пункт назначения, то это дает список, который вы сказали, что хотите. Я не знаю, как его производительность будет сравниваться с форпасом. Вам просто нужно попробовать.

SELECT a.Flight, a.Source, c.Destination
FROM source_destination_flight a,
  (SELECT d.Flight, Min(d.id) AS Minid, Max(d.id) AS Maxid 
    FROM source_destination_flight d GROUP BY Flight) b,
  source_destination_flight c
WHERE a.id = b.Minid
AND c.id = b.Maxid;

Другие вопросы по теме