本文主要分享SQL重复数据删除方法的总结。在使用SQL提取数据时,我们经常会遇到表中的重复值。例如,如果我们想要获得uv(独立访问者),我们需要进行重复数据删除。我们来看看减肥的方法。
在使用SQL提取数据时,我们经常会遇到表中的重复值。例如,如果我们想要获得uv(独立访问者),我们需要进行重复数据删除。
在Mysql中,通常使用distinct或group by子句,但在支持窗口函数的sql(如Hive SQL、Oracle等)中。),row_number窗口函数也可用于重复数据删除。
举个栗子,现有这样一张表 task:
备注:
Task_id:任务id;Order_id:订单id;开始时间:开始时间
注意
:一个任务对应多个订单。我们需要找到任务的总数,因为task_id不是唯一的,所以我们需要消除重复:
distinct
-列出task_id的所有唯一值(重复数据删除后的记录)
选择不同的任务标识
来自任务;
-任务总数
选择计数(不同任务标识)任务编号
来自任务;
Distinct通常效率很低。它不适合显示重复数据删除后的具体值,通常与count一起使用来计算条形数。
当使用distinct时,它被放置在select之后,并且它后面的所有字段的值被统一进行重复数据消除。例如,如果distinct之后有两个字段,则两条记录1,1和1,2不是重复值。
group by
-列出task_id的所有唯一值(重复数据删除后的记录,null也是一个值)
-选择任务标识
-来自任务
-按任务标识分组;
-任务总数
选择计数(任务标识)任务编号
从(选择任务标识
来自任务
group by task _ id)tmp;
row_number
row_number 是窗口函数,语法如下:
Row_number() over(按字段名分区用于分组,按字段名排序用于组内排序)
其中可以省略部分分割。
-在支持窗口函数的sql中使用
select count(rn=1时的情况,然后task_id否则为空结束)task_num
从(选择任务标识
,row_number() over(按task_id分区,按start_time排序)rn
来自任务)tmp
此外,再借助一个表 test 来理理 distinct 和 group by 在去重中的使用:
-底部的分号;用于分隔行。
选择不同的用户标识
来自测试;-返回1;2
选择不同的用户标识、用户类型
来自测试;-返回1,1;1, 2;2, 1
选择用户标识
来自测试
按用户标识分组;-返回1;2
选择用户标识,用户类型
来自测试
group by user_id,user _ type-返回1,1;1, 2;2, 1
选择用户标识,用户类型
来自测试
按用户标识分组;
- Hive,Oracle等。将报告错误。mysql可以这样写。
-返回1,1或1,2;2,1(共两行)。只有group by之后的字段才会重复,也就是说最终返回的记录数等于前面sql中的记录数,也就是两条记录。
-未放在group by之后但放在select中的字段将只返回一条记录(就好像它通常是第一条记录,这应该是不规则的)
这就是这篇关于SQL重复数据消除方法概述的文章。有关SQL重复数据删除方法的更多信息,请搜索我们以前的文章或继续浏览下面的相关文章。希望你以后能支持我们!