sql 去除重复记录

打开不重复记录的单个字段(重复的NAME被过滤,只出现一次)

select distinct NAME from table 

打开不重复记录的所有字段值(有重复的NAME,且不是最小ID的记录被过滤,只出现最小ID的NAME)
select  * from table where ID in (Select min(ID ) FROM table group by NAME)        

 查出NAME字段不重复出现的记录(有重复的NAME被过滤,多于1次的NAME不出现了)

select  from table where NAME in (select NAME from table group by NAME having count(NAME)=1)    

 查出NAME字段重复出现大于1次的记录

select  from table where NAME in (select NAME from table group by NAME having count(NAME)>1)    

问题1:对于以下几个记录
ID
123456
123123
123456
123456
123789
所有执行完SQL后的结果顺序与原ID顺序相同,另外由于涉及到数十万条记录的操作,要求速度要快
要求结果1:去除重复ID,显示记录结果为
123456
123123
123789


要求结果1:
如果只取ID列
select distinct ID from table1
如果还有其他列,在id相同情况下,取col1最小的记录。
select ID,col1 from table1 t1 where not exists(select * from table1 where ID=t1.ID and col1>t1.col1)
要求结果2:去掉重复ID,显示结果为
123123
123789 (与结果1不同的是将所有123456都去除了,而结果1进行了保存)


要求结果2:
select ID from table1 t1
where not exists (select * from table1 where ID=t1.ID)
select ID from table1 t1
where (select count(*) from table1 where ID=t1.ID)=1
要求3:根据阈值的不同,决定是否进行重复过滤,例如阈值设置为2,由于123456的重复个数为3,那么由于3》2
结果为
123123
123789
如果阈值为4,由于3《
4
结果为
123456
123123
123456
123456
123789


要求3:例如阈值设置为2
select ID from table1 t1
where (select count(*) from table1 where ID=t1.ID)<=2
要求结果4:上面提到的过滤均是整个字段的过滤,如果有如下新的需求,只针对字段的前三位进行过滤,上面字段的前三位均是123,那么过滤结果是这6个字符串都是相同的(因为只取前三位作为比较依据),最终输出结果就是这六个字符串,
而如果选择前四位进行过滤,上面字段中有三个是相同的,1234开头的,最终输出结果就是这三个字符串



要求结果4:选择前四位进行过滤
select distinct ID
=left(ID,4) from table1
只要把前面语句中的ID换成left(ID,
4)就可以了。
posted @ 2011-07-22 11:45  jex  阅读(962)  评论(0编辑  收藏  举报