【Stackoverflow问题精选】SQL中去除重复行

问题

假设有一个数据量比较大的表(例如300,000+行),其中有重复的行(除了主键外,其他的列数据是一样的),如何快速去重呢?

我的表类似这样

MyTable
-----------
RowID int not null identity(1,1) primary key,
Col1 varchar(20) not null,
Col2 varchar(2048) not null,
Col3 tinyint not null

精华回答

假设没有null值,你可以先对其他列做group by,然后只保留MIN或者MAX(RowId),删除其他行:

DELETE MyTable
FROM MyTable
LEFT OUTER JOIN (
   SELECT MIN(RowId) as RowId, Col1, Col2, Col3
   FROM MyTable
   GROUP BY Col1, Col2, Col3
) as KeepRows ON
   MyTable.RowId = KeepRows.RowId
WHERE
   KeepRows.RowId IS NULL

如果RowId不是int类型,而是个GUID,则可以用

CONVERT(uniqueidentifier, MIN(CONVERT(char(36), MyGuidColumn))) 

stackoverflow链接:

http://stackoverflow.com/questions/18932/how-can-i-remove-duplicate-rows

时间: 2025-01-02 11:16:10

【Stackoverflow问题精选】SQL中去除重复行的相关文章

sql中去除重复的项

方法一:group by  (取最小的id)select min(id) id,T from Table_1 group by T 方法二:union (不需要id)select T from Table_1 where 1=0unionselect T from Table_1 方法三:DISTINCT select  DISTINCT T from Table_1

SQL语句技巧之去除重复行

去除表中重复行数据,可能大家立马就想到的是用DISINTCT关键字,但DISINTCT只能是去除表中所有列都相同的行,若碰到需要去除表中多个字段重复的行(即:部份相同,部份不相同),那么该如何做呢?我通过多年数据库编写经验,整理了如下方法,供大家参考和使用. 方法1:适用于返回较少字段 select F1,F2,F3,MAX(F4) FROM TABLENAME GROUP BY F1,F2,F3 方法2:适用于返回行所有字段,需指定不相同的字段 select * FROM TABLENAME

去除源文件中的重复行的程序流程及其C代码实现

(本文正在参加2015博客之星评选,诚邀你来投票,谢谢:http://vote.blog.csdn.net/blogstar2015/candidate?username=zhouzxi) 一.需求描述 要求对一个包含若干行记录且某几条记录相同的文件(源文件)实现去重操作,并将去重之后的记录写入到另外一个文件(目的文件)中.也即最后生成的文件中没有内容相同的两行记录.如果源文件中两条记录之间有空行,则在目的文件中一并将其去掉. 两条记录相同的标准是: 1) 字符个数及内容完全相同. 2) 去除空

sort排序命令 uniq 去除排序过的文件中的重复行 cut提取命令 wc 统计命令

sort 命令对 File 参数指定的文件中的行排序,并将结果写到标准输出.如果 File 参数指定多个文件,那么 sort 命令将这些文件连接起来,并当作一个文件进行排序. sort语法 [[email protected] ~]# sort [-fbMnrtuk] [file or stdin] 选项与参数: -f :忽略大小写的差异,例如 A 与 a 视为编码相同: -b :忽略最前面的空格符部分: -M :以月份的名字来排序,例如 JAN, DEC 等等的排序方法: -n :使用『纯数字

SQL Server删除重复行的6个方法

SQL Server删除重复行是我们最常见的操作之一,下面就为您介绍六种适合不同情况的SQL Server删除重复行的方法,供您参考. 1.如果有ID字段,就是具有唯一性的字段 delect   table  tableName  where   id   not   in   (   select   max(id)   from   table   group   by   col1,col2,col3...   )    group   by   子句后跟的字段就是你用来判断重复的条件,如

sql查询去除重复值语句

sql 单表/多表查询去除重复记录 单表distinct 多表group by group by 必须放在 order by 和 limit之前,不然会报错 ************************************************************************************ 1.查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断 select * from people where peopleId in (select

DataTable去除重复行

//抽取dt中的特定列"Region","Cur","Year"组合成新的dat DataTable dat = dt.DefaultView.ToTable(false, new string[]{ "Region","Cur","Year" }); DataView dv = new DataView(w_dt); //虚拟视图吧,我这么认为 //去除dv中的重复行并组合成新的dt2

实例详细说明linux下去除重复行命令uniq

地址:http://blog.51yip.com/shell/1022.html 一,uniq干什么用的 文本中的重复行,基本上不是我们所要的,所以就要去除掉.linux下有其他命令可以去除重复行,但是我觉得uniq还是比较方便的一个.使用uniq的时候要注意以下二点 1,对文本操作时,它一般会和sort命令进行组合使用,因为uniq 不会检查重复的行,除非它们是相邻的行.如果您想先对输入排序,使用sort -u. 2,对文本操作时,若域中为先空字符(通常包括空格以及制表符),然后非空字符,域中

sublime 去除重复行或者只保留唯一值

去除重复行或者只保留唯一值,分别对应两件事情. 去除重复行,指的是,将text 文档中所有有重复行的行不做保留,全都删除. 只保留唯一值,指的是,将text 文档中有重复行的保留且仅保留一个值,最后就实现整个text中每一行均为唯一值. 这两种方法都是基于正则表达式替换的方法,查找的模式是一样的(利用了正则表达式capture group的方法),区别在于替换目标的内容不同. sublime 去除重复行 首先,点击菜单栏edit -- sort进行排序. 查找内容为: ^(.+)$[\r\n](