Удаление дубликата с помощью sql - PullRequest
0 голосов
/ 01 июля 2018

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

Вопрос:

У меня есть таблица полетов, содержащая следующие значения:

From_City To_City Fare
 A         B      50000
 B         A      50000
 A         C      60000

Как убрать от А до В или от В до А, поскольку оно передает то же значение.

Окончательный результат должен быть:

  From_City To_City Fare
 A         B      50000
 A         C      60000

Ответы [ 3 ]

0 голосов
/ 01 июля 2018

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

SELECT CASE
         WHEN from_city > to_city,
           THEN to_city
         ELSE from_city
       END from_city,
       CASE
         WHEN from_city > to_city,
           THEN from_city
         ELSE to_city
       END from_city,
       max(fare) fare
       FROM elbat
       GROUP BY CASE
                  WHEN from_city > to_city,
                    THEN to_city
                  ELSE from_city
                END,
                CASE
                  WHEN from_city > to_city,
                    THEN from_city
                  ELSE to_city
                END;
0 голосов
/ 01 июля 2018

Я бы предложил:

select f.*
from flights f
where f.from_city < f.to_city
union all
select f.*
from flights 
where f2.from_city > f.to_city and
      not exists (select 1
                  from flights f2
                  where f2.from_city = f.to_city and
                        f2.to_city = f.from_city and
                        f2.fare = f.fare
                 );
0 голосов
/ 01 июля 2018

Вы можете использовать оператор exists. Поскольку вы хотите удалить только одну строку из пары дубликатов, вам необходимо принять произвольное решение, какой из них оставить, а какой - удалить. В следующем запросе я решил оставить тот с более низким from_city:

SELECT *
FROM   flights a
WHERE  NOT EXISTS (SELECT *
                   FROM   flights b
                   WHERE  a.from_city = b.to_city AND
                          a.to_city = b.from_city AND
                          a.fare = b.fare AND
                          b.from_city > b.to_city)
...