sql查询去重复数据 sql查询去重

上周,我的朋友在做一个数据分析项目,发现数据库中的数据包含大量重复项。
他尝试了多种方法来解决这个问题。

2 02 3 年,我教他首先使用DISTINCT关键字。
例如,当它查询不同城市的名称时,它使用以下 SQL 语句:SELECT DISTINCT city_name FROM table_name。

然后他又想了想,说GROUP BY子句也可以用来去重,虽然它通常是和聚合函数结合使用的。
例如,要计算每个电话号码出现的次数,他会编写:SELECT Telephone, COUNT() FROM test GROUP BY Telephone。

然后他提到了一种删除表中重复条目的方法。
他说可以先创建一个临时表,将不重复的数据导入其中,然后删除原表中的数据,然后再将数据插入到临时表中。
这个过程有点复杂,你必须小心,避免意外删除数据。

最后他还提到了UNION关键字,说它可以连接两个表的结果集,并自动去除重复行。
他说如果两个表都有列“column1 ”,可以这样写:SELECT columns1 FROM table1 UNION SELECT columns1 FROM table2
听完之后,我觉得这些方法都很实用,但是选择要根据具体情况而定。
他是对的,没有一刀切的方法。
由你决定。

sql count去重

等等,还有一件事。
我记得我公司上次做报表的时候,数据量有几十万。
我在使用 COUNT(DISTINCT) 时被卡住了 1 0 分钟,最后改变了方法来完成工作。
地点是办公室,空调特别热,尤其是三月份。

如何使用 SQL 查询去重技巧去除重复数据?

我需要和你谈谈这件事。
我曾经在一家公司做过ERP系统维护。
当时数据库总是出现问题,客户投诉不断。
这包括数据重复,这使得报告变得混乱。

我还记得在上海的一个冬天。
有的客户是电子商务公司。
数据库中的产品信息重复。
当我检查时,我惊讶地发现了数千条重复数据。
当时系统使用的是MySQL,我一直使用DISTINCT关键字来去除重复。
编写查询:
sql 选择不同的产品名称、产品代码 来自产品 其中产品代码不为空;
结果呢?返回不重复的产品名称和代码。
客户使用这些数据导入Excel,大多数问题都得到解决。
但是后来我发现这种方法用的太多的话,数据库的性能会下降,尤其是数据量很大的时候。

然后我又在 Oracle 数据库上找到了它。
当时的数据量要大得多,有数百万条记录。
目前,使用 DISTINCT 的功能还不是很强大。
我改为使用 GROUP BY 并添加了聚合函数。
例如:
sql 选择产品名称,COUNT() 来自产品 按产品名称分组 有 COUNT() > 1 ;
这个查询可以直接查出重复的商品名称以及重复次数。
然后客户可以手动删除重复项或使用程序来处理它们。
这种方法比仅仅使用 DISTINCT 更可靠。

然后,在广东的一个项目中,我遇到了更复杂的情况。
数据分散在多个表中,需要使用 LEFT JOIN 和聚合函数来解析。
例如:
sql SELECT a.product_id, a.product_name 来自产品a 左连接 ( 选择产品 ID,MAX(创建时间)AS 最大日期 来自产品日志 按产品 ID 分组 ) b ON a.product_id = b.product_id 其中 a.product_id = b.product_id;
此查询可以确保仅检索product_logs表中每个product_id的最新记录并将其链接到产品表。
这将避免跨表的数据重复。

哦,对了,还有一个窗口函数ROW_NUMBER(),我最近在一个新项目中使用了它。
当时是PostgreSQL,数据量要大得多,几千万条。
使用 ROW_NUMBER() 在几分钟内解决它:
sql 与我们排名产品 ( 选择, ROW_NUMBER() OVER (PARTITION BY Product_id ORDER BYcreated_at DESC) AS rn 来自产品_交易 ) 从 GradedProduct 中选择,其中 rn = 1 ;
这可确保仅检索每个product_id 的最新交易记录。
比之前的老方法效率高很多,数据库压力也小很多。

其实去强调关键要看具体情况。
有时使用DISTINCT最简单,有时需要使用GROUP BY加聚合函数,有时需要使用跨表JOIN。
您应该根据数据的特点和业务需求来选择方法。
这十年来,我经历了很多坎坷,才明白了这个道理。