SQL 查询结果去重的几种方式

SQL 查询结果去重的几种方式

在本文中,我们将介绍SQL中如何使用DISTINCT和ROW_NUMBER函数来对查询结果进行去重操作,以及它们的区别和示例使用方法。

阅读更多:SQL 教程

DISTINCT的使用

DISTINCT关键字用于从查询结果中去除重复的记录。它常用于SELECT语句的列名后面,如下所示:

SELECT DISTINCT 列名1, 列名2, ... FROM 表名;

下面我们通过一个例子来说明DISTINCT的使用。

假设我们有一个名为”users”的用户表,包含如下数据:

id | name   | age
---|--------|-----
1  | Alice  | 25
2  | Bob    | 30
3  | Alice  | 25
4  | Carol  | 35

我们可以使用以下SQL语句查询不重复的用户姓名:

SELECT DISTINCT name FROM users;

执行以上语句后,我们将得到如下结果:

name
-----
Alice
Bob
Carol

ROW_NUMBER的使用

ROW_NUMBER函数用于对查询结果进行编号,并根据指定的列对结果进行排序。它通常与子查询和OVER子句一起使用。以下是ROW_NUMBER函数的语法:

SELECT 列名1, 列名2, ..., ROW_NUMBER() OVER (ORDER BY 排序列) AS 行号 FROM 表名;

下面我们通过一个例子来说明ROW_NUMBER的使用。

假设我们有一个名为”orders”的订单表,包含如下数据:

order_id | customer_id | total_amount
---------|-------------|-------------
1        | 1           | 100
2        | 2           | 200
3        | 1           | 150
4        | 3           | 300

我们可以使用以下SQL语句查询按照总金额降序排列的订单,并添加行号:

SELECT order_id, customer_id, total_amount,
       ROW_NUMBER() OVER (ORDER BY total_amount DESC) AS row_number
FROM orders;

执行以上语句后,我们将得到如下结果:

order_id | customer_id | total_amount | row_number
---------|-------------|--------------|-----------
4        | 3           | 300          | 1
2        | 2           | 200          | 2
3        | 1           | 150          | 3
1        | 1           | 100          | 4

DISTINCT与ROW_NUMBER的区别

尽管DISTINCT和ROW_NUMBER都可以用于去重,它们在实现方式和用途上存在一些区别。

  • DISTINCT关键字适用于去除重复记录,它返回所有列,并且仅保留不重复的记录。它可以用于单个或多个列,但通常性能较低,尤其在处理大量数据时。

  • ROW_NUMBER函数用于对结果进行编号,并可以根据指定的排序列对结果进行排序。它返回原始查询中的列和行号,并不会主动去重。使用ROW_NUMBER通常需要将查询结果作为子查询,并与OVER子句一起使用。该方法适用于在查询结果中需要编号并排序的场景,性能相对较高。

示例

下面我们通过一个综合示例来演示DISTINCT和ROW_NUMBER的使用。

假设我们有一个名为”sales”的销售记录表,包含如下数据:

id | product | amount | month
---|---------|--------|------
1  | A       | 100    | July
2  | B       | 150    | July
3  | A       | 200    | August
4  | C       | 300    | August
5  | A       | 150    | September

示例一:使用DISTINCT去重

我们可以使用以下SQL语句查询每个月份销售的产品数量,并去除重复的产品:

SELECT month, COUNT(DISTINCT product) AS product_count
FROM sales
GROUP BY month;

执行以上语句后,我们将得到如下结果:

month     | product_count
----------|--------------
July      | 2
August    | 2
September | 1

示例二:使用ROW_NUMBER进行排序和编号

我们可以使用以下SQL语句查询每个月份销售最高的两个产品,并进行排序和编号:

SELECT month, product, amount,
       ROW_NUMBER() OVER (PARTITION BY month ORDER BY amount DESC) AS row_number
FROM sales
WHERE row_number <= 2;

执行以上语句后,我们将得到如下结果:

month     | product | amount | row_number
----------|---------|--------|-----------
July      | B       | 150    | 1
July      | A       | 100    | 2
August    | C       | 300    | 1
August    | A       | 200    | 2
September | A       | 150    | 1

总结

本文介绍了SQL中使用DISTINCT和ROW_NUMBER函数对查询结果进行去重的方法。DISTINCT关键字用于去除重复的记录,而ROW_NUMBER函数用于对结果进行编号和排序。它们分别适用于不同的场景,根据实际需求选择合适的方法可以提高查询效率和准确性。希望本文对你在SQL查询中去重操作有所帮助。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程