SELECT 
    distinct t.id,t.t1,t.t2,t.t3 
FROM 
    table1 t 
where 
    not exists(select 1 from table1 where id=t.id and t1=t.t1 and (t2<t.t2 or (t2=t.t2 and t3<t.t3))) 
ORDER BY 
    (t.t2+t.t3) desc  --/ asc

解决方案 »

  1.   

    DISTINCT只能过滤所有字段都完全一样的记录,在此处不适用:create table table1(id int,t1 varchar(10),t2 int,t3 int)
    insert into table1 select 1,'王',20,30 
    insert into table1 select 1,'王',40,60 
    insert into table1 select 1,'王',90,40 
    insert into table1 select 2,'李',30,24 
    insert into table1 select 2,'李',40,30 SELECT 
        t.id,t.t1,t.t2,t.t3 
    FROM 
        table1 t 
    WHERE 
        not exists(select 1 from table1 where id=t.id and t1=t.t1 and (t2<t.t2 or (t2=t.t2 and t3<t.t3))) 
    ORDER BY 
        (t.t2+t.t3) desc  -- 升序排列则替换为 asc /*
    id          t1         t2          t3          
    ----------- ---------- ----------- ----------- 
    2           李          30          24
    1           王          20          30
    */drop table table1
      

  2.   

    --<一>:
    select distinct * into #temp from 表
    truncate table 表
    insert 表 select * from #temp
    drop table
    --<二>
    带有标识列
    --备份数据
    select * into #temp from 表
    alter table #temp drop column id--删除原表数据
    truncate table msgtable--恢复数据并去掉重复数据
    insert into 表 select distinct * from #temp--<三>
    delete From aa where a in ( select a From aa group by a having count(a)>1)
    --<四>
    alter table 表 add newfield int identity(1,1)delete 表
    where newfield not in(select min(newfield) from 表 group by 除newfield外的所有字段)alter table 表 drop column newfield
    --<五>
    --添加一个处理的标识字段
    alter table 表 add id int identity(1,1)
    go
        
    --删除重复记录
    delete a
    from 表 a left join(select id=min(id) from 表 group by a,b)b on a.id=b.idwhere b.id is null
    go--删除处理用的标识字段
    alter table 表 drop column id
    --参考:
    /*
    一张表里面以两个字段为唯一字段,当几条记录的这两个字段完全相同时,需要删除重复项,如下表   
      a   b   c   d   
      1   2   3   4   
      1   5   3   5   
      1   2   7   9   
      以a、b为唯一字段,第一条和第三条的a、b完全相同,所以,需要删除第一条记录1   2   3   4   或者第三条记录1   2   7   9   
      即如下结果:   
      a   b   c   d   
      1   2   3   4   
      1   5   3   5   
      或   
      a   b   c   d   
      1   5   3   5   
      1   2   7   9   
        
      请问各位大侠这种sql语句怎么写 */  
        
     
    CREATE TABLE Tb1(id int, [a] varchar(255), [b] varchar(255), [c] varchar(255), [d] varchar(255))
    INSERT Tb1(id, [a], [b], [c], [d])
    SELECT 1, '1','2','3','4'
    UNION ALL SELECT 2, '1','5','3','5'
    UNION ALL SELECT 3, '1','2','7','9'
    UNION ALL SELECT 4, '1','4','7','6'delete Tb1 where [id] not in (select max([id]) from Tb1 group by a,b )
    select * from tb1drop table tb1如果要同时删除第一和第三行
    即如下结果:
    a b c d
    1 5 3 5语句如下:delete m from tb t
    inner join
    (
    select a ,b
    from tb
    group by a , b
    having count(*)>1
    )n
    on m.a = n.a and m.b = n.b

    delete * from tb as m,
    (
    select a ,b
    from tb
    group by a , b
    having count(*)>1
    )n
    where m.a = n.a and m.b = n.b
    --在几千条记录里,存在着些相同的记录,如何能用SQL语句,删除掉重复的呢?谢谢!
    1、查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断
    select * from people
    where peopleId in (select peopleId from people group by peopleId having count(peopleId) > 1)2、删除表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断,只留有rowid最小的记录
    delete from people
    where peopleId in (select peopleId from people group by peopleId having count(peopleId) > 1)
    and rowid not in (select min(rowid) from people group by peopleId having count(peopleId )>1)3、查找表中多余的重复记录(多个字段)
    select * from vitae a
    where (a.peopleId,a.seq) in (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1)4、删除表中多余的重复记录(多个字段),只留有rowid最小的记录
    delete from vitae a
    where (a.peopleId,a.seq) in (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1)
    and rowid not in (select min(rowid) from vitae group by peopleId,seq having count(*)>1)5、查找表中多余的重复记录(多个字段),不包含rowid最小的记录
    select * from vitae a
    where (a.peopleId,a.seq) in (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1)
    and rowid not in (select min(rowid) from vitae group by peopleId,seq having count(*)>1)
      

  3.   


    SELECT t.id,t.t1,t.t2,t.t3 
    FROM table1 t 
    where not exists(select 1 from table1 where id=t.id and t1=t.t1 and (t2<t.t2 or (t2=t.t2 and t3<t.t3))) 
      

  4.   

    select * from table1 a where not exists(select 1 from table1 where t1=a.t1 and t2<a.t2) order by t2+t3 desc
      

  5.   

    --创建测试数据
    IF OBJECT_ID('LI') IS NOT NULL
       DROP TABLE LI create table LI(id int,t1 varchar(10),t2 int,t3 int)
    insert into LI select 1,'王',20,30 
    insert into LI select 1,'王',40,60 
    insert into LI select 1,'王',90,40 
    insert into LI select 2,'李',30,24 
    insert into LI select 2,'李',40,30 --查询结果
    ;WITH TLI AS(
    SELECT ROW_NUMBER() OVER(ORDER BY GETDATE()) AS RID,* 
    FROM LI)SELECT L.ID,L.T1,L.T2,L.T3 
    FROM TLI L 
    WHERE RID = (SELECT MIN(RID) FROM TLI WHERE [ID] = L.[ID] AND T1 = L.T1)  ---最终结果
    /*
    ID T1 T2  T3
    1  王 20 30
    2  李 30 24
    */