去除重复数据

有两个意义上的重复记录,一是完全重复的记录,也即所有字段均都重复,二是部分字段重复的记录。对于第一种重复,比较容易解决,只需在查询语句中使用distinct关键字去重,几乎所有数据库系统都支持distinct操作。发生这种重复的原因主要是表设计不周,通过给表增加主键或唯一索引列即可避免。

select distinct * from t;

对于第二类重复问题,通常要求查询出重复记录中的任一条记录。假设表t有id,name,address三个字段,id是主键,有重复的字段为name,address,要求得到这两个字段唯一的结果集。

-- Oracle、MySQL,使用相关子查询

select * from t t1

where t1.id =

(select min(t2.id)

from t t2

where t1.name = t2.name and t1.address = t2.address);

-- Hive只支持在FROM子句中使用子查询,子查询必须有名字,并且列必须唯一

select t1.*

from t t1,

(select name, address, min(id) id from t group by name, address) t2

where t1.id = t2.id;

-- 还可以使用Hive的row_number()分析函数

select t.id, t.name, t.address

from (select id, name, address,

row_number() over (distribute by name, address sort by id) as rn 

from t)

where t.rn=1;

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏乐沙弥的世界

簇表及簇表管理(Index clustered tables)

--========================================

1533
来自专栏乐沙弥的世界

Oracle 分区表

随着表的不断增大,对于新纪录的增加、查找、删除等(DML)的维护也更加困难。对于数据库中的超大型表,可通过把它的数据分成若干个小表,从而简化数据库的管理活动。...

832
来自专栏lgp20151222

MySQL中有关TIMESTAMP和DATETIME的对比

1> 两者都可用来表示YYYY-MM-DD HH:MM:SS[.fraction]类型的日期。

812
来自专栏电光石火

数据库中的左连接(left join)和右连接(right join)区别

Left Join / Right Join /inner join相关 关于左连接和右连接总结性的一句话: 左连接where只影向右表,右连接...

1918
来自专栏黑泽君的专栏

MySQL学习小结

1151
来自专栏Aloys的开发之路

oracle表空间不足相关问题解决办法

oracle 临时表空间和数据表空间 Oracle临时表空间主要用来做查询和存放一些缓冲区数据。临时表空间消耗的主要原因是需要对查询的中间结果进行排序。重启数据...

2555
来自专栏电光石火

数据库中的左连接(left join)和右连接(right join)区别

Left Join / Right Join /inner join相关

1966
来自专栏杨建荣的学习笔记

闪回归档的简单测试(r8笔记第68天)

11g里面的新特性闪回归档,为历史数据的定制查询提供了一种可能。抽时间学习了一下这个特性,发现还是比较清晰易用。如果使用得当还是很不错的一个特性。 我们来简单模...

3165
来自专栏北京马哥教育

优化临时表使用,SQL语句性能提升100倍

【问题现象】 线上mysql数据库爆出一个慢查询,DBA观察发现,查询时服务器IO飙升,IO占用率达到100%, 执行时间长达7s左右。 SQL语句如下: SE...

2898
来自专栏GreenLeaves

SQL学习之去重复查询

下面是一张表的数据 ? 执行select content from dbo.Logo,返回以下结果 ? 但是这个时候我们只需要相同的内容中的一个即可,但是查询出...

1957

扫码关注云+社区