if not object_id('Tempdb..#T') is null
droptable #T
GoCreatetable #T([ID] int,[Name] nvarchar(1),[Memo] nvarchar(2))
Insert #T
select1,N'A',N'A1'unionallselect2,N'A',N'A2'unionallselect3,N'A',N'A3'unionallselect4,N'B',N'B1'unionallselect5,N'B',N'B2'Go
--I、Name相同ID最小的记录(推荐用1,2,3),方法3在SQl05时,效率高于1、2
方法1:
Select * from #T a wherenotexists(select1from #T where Name=a.Name and ID<a.ID)
方法2:
select a.* from #T a join (selectmin(ID)ID,Name from #T groupby Name) b on a.Name=b.Name and a.ID=b.ID
方法3:
select * from #T a where ID=(selectmin(ID) from #T where Name=a.Name)
方法4:
select a.* from #T a join #T b on a.Name=b.Name and a.ID>=b.ID groupby a.ID,a.Name,a.Memo havingcount(1)=1
方法5:
select * from #T a groupby ID,Name,Memo having ID=(selectmin(ID)from #T where Name=a.Name)
方法6:
select * from #T a where (selectcount(1) from #T where Name=a.Name and ID<a.ID)=0
方法7:
select * from #T a where ID=(select top 1 ID from #T where Name=a.name orderby ID)
方法8:
select * from #T a where ID!>all(select ID from #T where Name=a.Name)
方法9(注:ID为唯一时可用):
select * from #T a where ID in(selectmin(ID) from #T groupby Name)
--SQL2005:
方法10:
select ID,Name,Memo from (select *,min(ID)over(partition by Name) as MinID from #T a)T where ID=MinID
方法11:
select ID,Name,Memo from (select *,row_number()over(partition by Name orderby ID) as MinID from #T a)T where MinID=1
生成结果:
/*
ID Name Memo
----------- ---- ----
1 A A1
4 B B1
(2 行受影响)
*/
--II、Name相同ID最大的记录,与min相反:
方法1:
Select * from #T a wherenotexists(select1from #T where Name=a.Name and ID>a.ID)
方法2:
select a.* from #T a join (selectmax(ID)ID,Name from #T groupby Name) b on a.Name=b.Name and a.ID=b.ID orderby ID
方法3:
select * from #T a where ID=(selectmax(ID) from #T where Name=a.Name) orderby ID
方法4:
select a.* from #T a join #T b on a.Name=b.Name and a.ID<=b.ID groupby a.ID,a.Name,a.Memo havingcount(1)=1
方法5:
select * from #T a groupby ID,Name,Memo having ID=(selectmax(ID)from #T where Name=a.Name)
方法6:
select * from #T a where (selectcount(1) from #T where Name=a.Name and ID>a.ID)=0
方法7:
select * from #T a where ID=(select top 1 ID from #T where Name=a.name orderby ID desc)
方法8:
select * from #T a where ID!<all(select ID from #T where Name=a.Name)
方法9(注:ID为唯一时可用):
select * from #T a where ID in(selectmax(ID) from #T groupby Name)
--SQL2005:
方法10:
select ID,Name,Memo from (select *,max(ID)over(partition by Name) as MinID from #T a)T where ID=MinID
方法11:
select ID,Name,Memo from (select *,row_number()over(partition by Name orderby ID desc) as MinID from #T a)T where MinID=1
生成结果2:
/*
ID Name Memo
----------- ---- ----
3 A A3
5 B B2
(2 行受影响)
*/
sql根据某一个字段除重的方法收集(转)相关SQLif not object_id('Tempdb..#T') is null drop table #TGoCreate table #T([ID] int,[Name] nvarchar(1),[Memo] nvarchar(2))Insert #Tselect 1,N'A',N'A1' union allsel...