首页 > 解决方案 > 访问查询:根据最大值删除重复记录

问题描述

我有以下表结构:

具有质量得分的邮件联系人

我希望能够从表中删除重复的邮件,只为每个邮件帐户留下质量得分最高的邮件。目前我想出了以下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]
    );

但是,当我运行它时,它会询问我一个参数值,并且显然没有按我的预期工作。

你有什么解决办法吗?

标签: sqlms-access

解决方案


您可以将查询简化为:

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]
);

如果有重复的分数,那么您可以保留最高分数和最低 id 的行,如下所示:

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))
);

推荐阅读