SQL去重的三种方法汇总

显然,SQL 中去重的方法有 DISTINCT、GROUP BY 和 ROW_NUMBER() 三种,但如果用在正确的场景下,可以省去很多麻烦。

DISTINCT是最直接的,即整条记录中的所有字段值必须完全相同才算重复。
例如,去年我们做了一个电子商务统计项目。
计算唯一用户数时,只需使用 COUNT(FAR user_ID),但不要使用它来检查特定记录。
效率很差,数据量大时CPU会出现峰值。
还有一点就是它对于多个字段的去重非常死板。
user_id=1 user_type=1 和 user_id=1 user_type=2 是不同的,除非所有字段都相同。
起初我以为他表现不佳是因为这个,但后来我发现这是错误的。
主要原因是它需要扫描整个表以找到唯一的组合。
去年,数百万参赛作品的日程被挤得水泄不通。

GROUP BY 更灵活一些。
它按特定字段进行分组,并默认每组返回一条记录。
例如,使用子查询先分组,然后去重,如MySQL中的SELECT COUNT(task_id) FROM (SELECT task_id FROM Task GROUP BY task_id) tmp。
非组字段将取随机值(例如,可能包含具有相同task_id但不同user_ids的所有记录)。
还有一个更重要的细节。
它与聚合函数配合得很好。
但是,请记住,非聚集字段可能会在其他数据库中直接崩溃。
使用前必须确认兼容性。

ROW_NUMBER()窗口函数适用于复杂的逻辑,例如保留每组的最早记录。
去年处理订单数据的时候,我们用ROW_NUMBER() OVER (PARTITION BY task_id ORDER BY start_time) AS rn,然后WHERE rn=1 来解决,但是这个需要配合子查询,而且像MySQL这样没有窗口函数的数据库根本无法使用,所以必须使用Hive或者Oracle。
老实说,这有点棘手,但在保留最新/最旧的记录方面,它是首屈一指的。

警告:使用 DISTINCT 时不要直接检查特定记录。
例如,如果你想查看去除重复后的用户列表,它只会给你一个唯一的组合,但顺序很乱,除非你添加 ORDER BY。

sql中distinct的用法(四种示例分析)

哎哟,我刚入行的时候也很头疼这个东西。
针对你提到的场景,我给你讲一下我遇到过的实际例子。

例如,删除重复值是最常见的。
我2 01 4 年刚接手一个老项目,在用户表users中,有些人的昵称被注册了好几次。
当时我用的是SELECT DISTINCT昵称FROM用户; 直接查找所有唯一的昵称。
光看结果,嘿嘿,瞬间精简了上百个昵称。
这些用户确实知道如何想出一些奇怪的昵称。

另一个示例是组合多个列以删除重复的组合。
我也可以用这个。
有一个订单表。
有时,用户会下多个订单,但地址和电话号码可能相同。
例如,如果我想查看有多少种不同的“用户-地址”组合,我会写 SELECT DISTINCT user_id, address FROM 命令; 这样,即使用户A在同一地址下了三笔订单,也只会被算作一个组合。
用于计算当年的年度用户活跃地址分布。

我也将其与其他 SQL 语句结合使用。
例如,有一次我想给顾客发优惠券,列表中不能有重复的名字,必须按名字排序。
我只是使用了 SELECT DISTINCT name FROMcustomers ORDER BY name ASC; 并且直接完成了。
你不必手动筛选每一项,计算机比人脑更快。

我对嵌套查询有点困惑。
您在示例中编写的方式似乎有问题。
我当时尝试过类似的事情。
例如,如果我想查看每个系有多少个学生,我可能会先使用子查询提取学生表中的系,然后使用 DISTINCT 删除重复项,最后对它们进行分组。
大致是这样写的:
sql 选择部门,COUNT() AS Student_count 来自( 从学生中选择不同的部门 ) AS 查询 按部门分组;
不管怎样,最终我们可以得到每个系的学生人数,不存在重复的系。
然而,嵌套查询有时写起来很乱,所以你必须慢慢来。

一般来说,如果你经常使用 DISTINCT,它就会变得很容易使用。
刚开始使用的时候,对电脑很困惑,问了很多前辈。
现在想来,其实就是过滤掉重复的数据,让结果更加干净。
如果你多练习,你一定能做到。

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

哈,让我们消除SQL中的重复。
我将向您提供一些最常见的方法,以确保您一听到就明白。
1 . DISTINCT关键字,最简单也是最残酷的方法 您可以在 SELECT 之后添加 DISTINCT,例如查看不同的城市名称: 广场 SELECT DISTINCT city_name FROM table_name
这会删除所有重复的城市名称,特别适合在查询记录时直接查找不同值。
2 、group by子句,带有聚合函数,比较实用。
这个方法有点不同。
它不会直接删除重复行,而是使用聚合函数(如 COUNT)在分组后合并重复行。
广场 SELECT PHONE, COUNT() FROM GROUP BY PHONES FOR TEST
这样结果就是每个电话号码和出现的次数,相当于隐式消除重复。
但如果你直接在手机上使用 GROUP BY 而不编写通用函数,你会得到一个错误,因为 SQL 不知道如何处理重复的行。
3 、删除重复记录,适合表数据量较大,需要彻底清理的情况。
如果您不想保留重复数据,您可以: 1 .首先将唯一记录放入临时表中: 广场 创建表温度为 SELECT FROM a_dist
2 。
删除第一个表中的所有数据: 广场 从 a_dist 中删除
3 重新输入临时表数据: 广场 从Temperature中选择
输入4 .删除临时表(可选): 广场 降低表温度
此操作要小心。
如果数据丢失,则无法恢复,建议先做好备份。
4 . UNION关键字,合并多个表的减法结果 这个不常用,但是场景很特殊。
例如,您有两个表,table1 和 table2 ,并且您想要合并 column1 并删除重复项: 广场 SELECT column1 FROM table1 SELECT column1 FROM table2
注意 UNION 会自动删除重复项,但 UNION ALL 不会。
如果要保留所有记录,请选择第二个。
总结一下 使用DISTINCT检查数据非常方便。
如果要删除表中的重复数据,请使用第三种方法。
GROUP BY 和 UNION 很少使用,但它们也可以删除重复项。
关键是根据你的具体需求。

如果您还有其他疑问,例如某个场景使用哪种方法如果你应该的话,让我帮你看看其他地方。