日期:2014-05-17  浏览次数:20724 次

对于重复行,如何只保留重复行中的一行?例如....
对于重复行,如何只保留重复行中的一行?例如....

有数据表wzbm有w_name,bm,dw三列,已知w_name有重复的行

想用SELECT distinct w_name,bm,dw FROM wzbm 排除重复行后导入新的表中,用这样的方法来清除重复行中多余的,但不行,用 distinct w_name 可以,但后面再加别的列就不行了。


如何能做到对于w_name有重复的行,只保留一行?
或者筛选出来都是唯一的行后,再导入新表也行

------解决方案--------------------

select *
from wzbm t
where not exists (select 1 from wzbm where w_name = t.w_name and bm > t.bm)

------解决方案--------------------
参考下贴中的多种方法

http://blog.csdn.net/acmain_chm/article/details/4126306
[征集]分组取最大N条记录方法征集,及散分....
------解决方案--------------------
Use tempdb
GO
Create table dbo.wzbm
(w_name varchar(10),bm int,dw int )
Go
Insert Into dbo.wzbm values('a',1,2),('a',2,3),('b',2,3)
Go

with tb as 
(
Select *,ROW_NUMBER() Over (Order by w_name) as rn
From dbo.wzbm
)
Select t1.w_name,t1.bm,t1.dw
From tb as t1
Where not exists 
(Select * 
From tb as t2
where t2.rn > t1.rn And t1.w_name = t2.w_name
)

你看这样行不,通过给表添加行号。
------解决方案--------------------
引用:
我发现这样好像就行,不知对不对

SELECT  w_name,bm,dw FROM wzbm 
group by w_name,bm,dw

这跟你上面说的意思不同,这个是求w_name,bm,dw这3列都有重复的行,则只要显示一个

而非 有数据表wzbm有w_name,bm,dw三列,已知w_name有重复的行,但并不表示bm,dw这两列也有相同的值


------解决方案--------------------
  看上去有点复杂
------解决方案--------------------
Use tempdb
GO
Create table dbo.wzbm
(w_name varchar(10),bm int,dw int )
Go
Insert Into dbo.wzbm values('a',1,2),('a',2,3),('b',2,3)
Go
     
with tb as 
(
    Select *,ROW_NUMBER() Over (Order by w_name) as rn
    From dbo.wzbm
)
Select w_name,bm,dw
From tb
where rn in 
(
Select max(rn)
From tb
group by w_name
)

--对 w_name 进行分组,查询出w_name对应的集合中 rn 列最大的行
------解决方案--------------------
delete table where id not in(select w_name, max(ID) from table group by w_name)