Запрос доступа: удаление дублированных записей на основе максимального значения - PullRequest
0 голосов
/ 24 февраля 2020

У меня следующая структура таблицы:

Mail Contacts with Quality Score

Я хотел бы иметь возможность удалять из таблицы дублированные письма, оставляя для каждого письма учитывайте только ту, которая имеет самый высокий показатель качества. На данный момент у меня есть следующий SQL код:

DELETE *
FROM Table
WHERE ( Table.[Email Adress] &  Table.[Quality Score] ) NOT IN 
    (
    SELECT  (Table.[Email Adress] & Max(Table.[Quality Score])
    FROM Table
    GROUP BY  Table.[Email Adress]
    );

Однако, когда я его запускаю, он запрашивает у меня значение параметра и явно не работает так, как я планировал.

У вас есть какое-нибудь решение?

Ответы [ 2 ]

1 голос
/ 24 февраля 2020

Вы можете упростить ваш запрос следующим образом:

DELETE FROM Table AS t
WHERE t.[Quality Score] <> (
    SELECT Max([Quality Score])
    FROM Table
    WHERE [Email Adress] = t.[Email Adress]
);

Не нужно GROUP BY [Email Adress], но вам нужно предложение WHERE. Или с помощью EXISTS:

DELETE FROM Table AS t
WHERE EXISTS (
  SELECT 1 FROM Table
  WHERE [Email Adress] = t.[Email Adress] AND [Quality Score] > t.[Quality Score]
);

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

DELETE FROM Table AS t
WHERE EXISTS (
  SELECT 1 FROM Table
  WHERE [Email Adress] = t.[Email Adress] 
    AND ([Quality Score] > t.[Quality Score] OR ([Quality Score] = t.[Quality Score] AND id < t.id))
);
1 голос
/ 24 февраля 2020

Один метод использует коррелированный подзапрос:

delete from t
where t.quality_score < (select max(t2.quality_score)
                         from t as t2
                         where t2.email_address = t.email_address
                        );

Примечание. Если у вас есть дубликаты наивысших баллов, они сохраняются. Для адресации можно использовать столбец id:

delete from t
where t.id <> (select top 1 t2.id
               from t as t2
               where t2.email_address = t.email_address
               order by t2.quality_score desc, id
              );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...