SQL去重的三种方法汇总

哎,你问的是SQL中的推导方法吧?好啦,我就给大家讲一下我踩过的坑以及我们使用的几种方法。

上周,客户问我表中有很多重复数据,他想检查干净列表。
我立即告诉他事实:SQL中去除重复的主要方法有3 种。

首先是使用关键字。
这是一个很简单的事情,但是有时候却没有什么效果。
只需将 DISTINCT 放在 SELECT 和要复制的字段之后即可。
例如,有一个用户表。
如果要检查人数是否不重复,只需编写 SELECT AGE DISTINCT FROM users 即可。
DISTINCTIVE表示法一般不单独使用,与COUNT或GROUP BY结合使用更有效。
上次我在上海做一个项目,我使用了独立买家订单号中的COUNT(唯一的user_id)。
我发现当数据量很大时,查询速度非常慢,建表时间也很长。

其次,使用 GROUP BY 子句。
这种方法比较灵活,不仅可以去重,还可以进行分组统计。
原理是什么?将重复的行合并为一行,如 SELECT task_id, COUNT() FROMnested GROUP BY task_id。
这样每个任务只会出现一次,多一列才算生效。
我在北京做报表系统的时候,就是用这个来统计每个部分的人数的。
按部门、员工分组选择计划、NUMBER()。
由于数据库对耦合操作进行了优化,效率比单独的要好很多。

第三种方法是使用ROW_NUMBER窗口函数。
这个技巧适合大多数玩家和复杂的场景。
它会按照规则给每部分数据一个序号,然后你把ROW_NUMBER() OVER(通过划分列来划分FIELD ORDER),并额外添加UBIC rn = 1 以获得每组的第一部分。
例如,如果查看的是第一行的用户的表,则 SELECT FROM (SELECT, ROW_NUMBER() ON (partition by user_id ORDER BY order_date) AS rn FROM order) AS under WHERE rn = 1 注意,此方法需要数据库支持 Windows 功能,例如 SQL Server 和 PostgreSQL,但不支持旧的 Oracle 1 1 g。

我的坑是我的经历,我曾经在MySQL 5 .7 中明显用过处理几百G的数据,CPU直接搬到了1 00%。
最后改成GROUP BY解决了问题。
所以选择哪种方法要根据情况而定:轻数据就区别使用,省事;使用GROUP BY进行分组统计;对于复杂场景或需要特定行控制的情况,请使用 ROW_NUMBER。

有适合你的东西。
它不是绝对最好,只是最好。

sql:关于distinct的用法

呃?你是对的...... DISTINCT 就是这个东西的作用,删除重复项。

想想看,查表,你会发现一堆重复的东西,很无聊。
使用 DISTINCT,嘿,我不会告诉你区别。

例如,您想知道 2 02 2 年在某个城市(例如上海)有多少人购买了某个品牌的鞋子,假设它称为“A 牌”鞋子。
你直接写:
sql 选择不同的 customer_id 订单数量 WHERE Product_name = 'A 品牌鞋' AND order_date 介于“2 02 2 -01 -01 ”和“2 02 2 -1 2 -3 1 ”之间 AND 城市 = '上海';
这条SQL将为您列出所有来自上海、购买过“A牌鞋”的客户ID。
每个ID只出现一次,重复的不予统计。
就是这样。

有时你想知道2 02 2 年上海有多少人会购买“A牌鞋”?接下来,您必须使用聚合函数。

例如,使用COUNT:
sql 选择计数(不同的 customer_id) 订单数量 WHERE Product_name = 'A 品牌鞋' AND order_date 介于“2 02 2 -01 -01 ”和“2 02 2 -1 2 -3 1 ”之间 AND 城市 = '上海';
这涉及到计算唯一 customer_id 的数量。
结果是代表总人数的数字。

如果你用 GROUP BY 来做呢?嗯……这次的用法不一样。
GROUP BY 通常按某个字段分组,例如按月或地区。
如果您使用 GROUP BY city 并且想查看有多少不同的人在上海和北京进行了购买,那么使用带有聚合函数的 DISTINCT 就足够了。

例如:
sql 选择城市,COUNT(DISTINCT customer_id) AS unique_customers 订单数量 WHERE Product_name = 'A 品牌鞋' AND order_date 介于“2 02 2 -01 -01 ”和“2 02 2 -1 2 -3 1 ”之间 按城市分组;
这是按城市分组,然后计算每个城市的独特鞋子购买者的数量。
您不再需要编写 GROUP BY customer_id,因为 COUNT(DISTINCT customer_id) 本身会进行分组统计。

因此,DISTINCT 与 SELECT 一起使用来删除重复的行。
将其与聚合函数一起使用来计算不同值的数量。
与 GROUP BY 一起使用,您还可以删除重复项,但这通常是不必要的,因为聚合 + GROUP BY 函数已经可以完成此工作。

请记住,DISTINCT 在将整行视为重复之前将其视为相同。
不只是某个连续的字段是相同的。
这会影响性能。
如果你的表很大,重复数据删除肯定会比较慢。
我必须小心。

嗯...仅此而已。

数据库中 DISTINCT 的作用是什么?

嗯...不同...它是删除重复...非常有用...忘记重复的行...
例如...2 02 2 年...我在北京...制定一个时间表...称为订单...里面有很多订单...一些公司名称重复...
时间表看起来像这样...公司和订单号...2 ...W5 School...4 6 9 8 ...W3 School 6 9 5 3 ...
如果你只是想看看公司有什么...没有不同...只有公司...出现了一些 W3 School...
但我想使用不同...从订单中选择不同公司...出来的是 IBM...W3 School...Apple...像这样...
选择不同字段...
选择公司、国家...然后两者必须相同才能被视为重复...
例如,如果公司是 W3 School...国家是美国...而公司是 W3 School...国家是英国...它不会被视为重复...
语法是 SELECT DISTINCT 列名 FROM 表名...
但是,如果表名...很简单...
例如,数十万个项目...使用 unique...效率低下...
我后来意识到...有时没有差异...只需计算并删除重复值...更快...
但是...distinct 只删除重复...返回唯一值...多个字段意味着多个条件...只需理解...

SQL语句对某字段去重?

Distinct 过滤重复值,效率低下。

例如:与用户的名称不同,返回唯一的名称。

必须在选择之前放置。
在distinct之后,只能选择distinct字段。

使用大量数据时请谨慎使用。
你自己掂量一下吧。