0
点赞
收藏
分享

微信扫一扫

sql 如何去重

1. 使用 DISTINCT 关键字

DISTINCT 关键字用于返回唯一不同的值。

SELECT DISTINCT column1, column2 FROM table_name;

这会返回 column1 和 column2 组合的所有唯一行。

2. 使用 GROUP BY

如果你想要对某些列进行分组,并对每个组应用聚合函数(如 COUNT, MAX, MIN 等),可以使用 GROUP BY。

SELECT column1, column2 FROM table_name GROUP BY column1, column2;

这将返回每个唯一 column1 和 column2 组合的行。

3. 使用 ROW_NUMBER() 或 RANK() 窗口函数(适用于SQL Server, PostgreSQL, Oracle等)

这些函数可以为结果集中的每行分配一个唯一的序号,然后你可以基于这个序号选择不重复的行。

SELECT * FROM (
    SELECT *, ROW_NUMBER() OVER(PARTITION BY column1, column2 ORDER BY some_column) as rn
    FROM table_name
) temp_table
WHERE rn = 1;

这里,PARTITION BY 子句用于定义哪些列的组合将被视为唯一,ORDER BY 子句定义了如何为每组分配序号。

4. 使用 GROUP BY 与聚合函数结合(去除重复行但不完全保留所有列信息)

如果你想要去除重复的行,但只想保留某些列的聚合信息,可以这样做:

SELECT column1, MAX(column2) as max_column2, COUNT(*) FROM table_name GROUP BY column1;

5. 使用 CTE(公用表表达式)和 ROW_NUMBER()(适用于SQL Server, PostgreSQL, Oracle等)

CTE 可以与窗口函数一起使用来去重。

WITH RankedResults AS (
    SELECT *, ROW_NUMBER() OVER(PARTITION BY column1 ORDER BY column2) as rn
    FROM table_name
)
SELECT * FROM RankedResults WHERE rn = 1;

6. 使用 DELETE 语句删除重复行(谨慎使用)

如果你想要删除重复的行,可以这样做(注意:这将永久删除数据,请确保你有备份):

DELETE t1 FROM table_name t1
JOIN (
    SELECT column1, MIN(id) as min_id  -- 假设id是主键或唯一标识符
    FROM table_name
    GROUP BY column1
    HAVING COUNT(*) > 1
) t2 ON t1.column1 = t2.column1 AND t1.id <> t2.min_id;

这些方法可以根据具体需求和数据库系统选择使用。每种方法都有其适用的场景。在处理数据时,请确保理解每种方法的影响,特别是在删除数据时。

举报

相关推荐

0 条评论