Удалить повторяющиеся строки в таблице - PullRequest
0 голосов
/ 21 июня 2020

У меня есть таблица, в которой я хочу удалить повторяющиеся строки в соответствии с 5 полями. Эти поля: origin_id, destination_id, market_id, cabin, tripType. Что я хочу сделать, так это удалить все записи с одинаковыми 5 полями, кроме одной записи с самым большим created_at. Я хочу иметь только одну запись для каждых 5 полей. После удаления дубликатов я создам уникальный индекс, но пока я не могу этого сделать из-за дубликатов.

То, что у меня есть, это этот запрос, но он, похоже, не работает:

DELETE FROM fares WHERE id NOT IN(
     SELECT f1.id FROM (SELECT * FROM fares) AS f1
     INNER JOIN (
          SELECT origin_id,destination_id,market_id,cabin,tripType,MAX(created_at) AS maxDate FROM fares
          GROUP BY origin_id,destination_id,market_id,cabin,tripType
     ) AS f2 ON f2.origin_id=f1.origin_id AND f2.destination_id=f1.destination_id AND 
     f2.market_id=f1.market_id AND f2.cabin=f1.cabin AND f2.tripType=f1.tripType
     WHERE f1.created_at=f2.maxDate
     GROUP BY f1.origin_id,f1.destination_id,f1.market_id,f1.cabin,f1.tripType
)

Приведенный выше запрос удаляет только 500 строк, но у меня 8k дубликатов. Что я захватываю с помощью следующего запроса.

SELECT SUM(f.numberOfFares) AS duplicateFares FROM (
    SELECT origin_id,destination_id,market_id,cabin,tripType,COUNT(1) AS numberOfFares FROM fares
    GROUP BY origin_id,destination_id,market_id,cabin,tripType
    HAVING count(1)>1
) AS f

Запрос выше приводит к этому

Я хочу иметь 1 запись для origin_id, destination_id, market_id, cabin, tripType группа

Думаю, проблема в записях с одинаковым значением created_at

SQLFiddle

1 Ответ

1 голос
/ 21 июня 2020

Шаблон, который вы ищете, называется «дедупликацией». В основном вы сравниваете, присоединяя таблицу к самой себе и удаляя те, которые вам не нужны:

delete F2
from Fares F1
join Fares F2 on F1.origin_id = F2.origin_id 
    and F1.destination_id = F2.destination_id 
    and F1.market_id = F2.market_id 
    and F1.cabin = F2.cabin 
    and F1.tripType = F2.tripType 
where F2.created_at = F1.created_at

Наличие индексов в столбцах, которые вы сравниваете, ускорит процесс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...