暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

热门SQL面试题:在 SQL 中删除重复行的2种方法

原创 小小亮 2022-12-14
3673

大家好,如果您想知道如何删除 SQL 中的重复行并在 SQL Server、MySQL 和 Oracle 等不同数据库上寻找解决方案,那么您来对地方了。在本文中,我将分享两种从 SQL 中删除重复行的方法,第一种是使用 GROUP BY 和 HAVING 子句,第二种是使用适用于大多数数据库的 RANK 函数。您可以使用任何方法通过 SQL 从表中删除重复项。这也是流行的SQL 面试问题之一,所以知道如何解决这个问题也会让你在面试中占据优势。

为什么需要删除重复行?

在开发 SQL Server 对象时,我们应该遵循特定的最佳实践。为保持数据完整性和性能,表应包括主键、标识列、聚簇和非聚簇索引以及约束。

即使我们遵循最佳实践,我们也可能会遇到诸如重复行之类的问题。我们也可能在数据导入期间在临时表中获取这些数据,并且我们希望在将它们插入生产表之前消除重复条目。

假设您的 SQL 数据库中有重复的行并且您想要删除它们。我们必须定期应对这些挑战。但是,如果我们在数据库中已经有重复的行,建议的做法是利用相关的键和约束来消除重复行的风险。

要清除重复数据,我们必须使用某些程序。本文讨论了从 SQL 表中删除重复数据的方法。

设置数据

在我们解决这个问题之前,我们需要一些示例数据来帮助我们将其可视化。让我们用一些数据制作一个员工表。

将使用以下查询。

CREATE TABLE Employee (id int(50) primary key, name varchar(80), salary int(50));
复制

现在,向该表中插入一些数据。我已经插入了一些数据如下。已经包含了一些令人兴奋的著名名字:p 希望你们喜欢板球!我们使用的是查找第 N 个最高薪水文章时使用的同一张表。但是,我们将添加一些重复项。更新后的表看起来像这样:

图片.png

可以看到,很明显我们有重复的记录,因为ID是主键,通常有自增的业务逻辑,这里可以忽略。

SQL DELETE 使用 GROUP BY 和 HAVING 子句

SQL GROUP BY 子句用于此方法中以查找重复条目。COUNT 函数可用于使用 Group By 子句检查行的出现,该子句根据提供的列组织数据。

例如,如果我们运行以下查询,我们将获得 Employee 数据库中发生率大于 1 的所有记录。

SELECT name, salary, 

    COUNT(*) AS CNT

FROM Employee

GROUP BY name, salary

HAVING COUNT(*) > 1;
复制

以下查询的结果如下所示:

图片.png

我们只需要保留一行并删除重复项。只需要删除表中的重复行。例如,Emp Virat 和 Chahal 在表中出现了两次。我们只是想摆脱它的一个实例。

为了计算每个数据行的最大 id,我们使用 SQL MAX 函数。

SELECT *

    FROM Employee

    WHERE id NOT IN

    (

        SELECT MAX(id)

        FROM Employee

        GROUP BY name, salary

    );
复制

上述查询的结果如下所示:

图片.png

我们可以看到上面的 Select 行省略了每个重复行的最大 ID 值,只留下最小 ID 值。

将第一个 Select 替换为 SQL delete 语句,如以下查询所示,以消除此数据。

DELETE 

    FROM Employee

    WHERE id NOT IN

    (

        SELECT MAX(id)

        FROM Employee

        GROUP BY name, salary

    );
复制

执行delete语句后对Employee表进行select,得到如下表项,没有重复行。

图片.png

SQL DELETE 使用 RANK 函数

我们还可以利用 SQL RANK 函数来去除重复的行。无论重复行如何,SQL RANK 函数都会为每一行返回一个唯一的行 ID。

PARTITION BY 子句在以下查询中与 RANK 函数一起使用。PARTITION BY 子句将数据划分为提供的列的子集,并为每个分区分配评级。

DELETE E

FROM Employee E JOIN

(

 SELECT *, 

        RANK() OVER(PARTITION BY name, salary

        ORDER BY id) rank

 FROM Employee

) T ON E.ID = T.ID;
复制

我们将得到的结果与上一个类似。所有重复项都将被删除。如您所见,该方法比前一个方法稍微复杂一些,但提供了一种更好的方法来对列进行排名和检查。您可以将 DELETE 关键字替换为 SELECT 并通过选择适当的列,您将能够看到列的排名和输出。

总结

在这篇文章中,我们研究了如何使用各种方法(包括 SQL 函数)删除 SQL 中的重复行。您可以自由使用任何让您感到最自在的方式。但是,我建议不要立即在生产数据上实施这些技术和打包。您应该在要求较低的环境中进行测试。

原文标题:2 Ways to remove duplicate rows in SQL? Example Tutorial
原文链接:https://www.sqlrevisited.com/2022/03/2-ways-to-remove-duplicate-rows-in-sql.html

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论