首页 > 代码库 > sql 语句查询 按某字段去重 保留按某个字段排序top1

sql 语句查询 按某字段去重 保留按某个字段排序top1

例子:
     建表: create table tablename  (id int identity(1,1),attachid int,name varchar(10))
 
      insert into tablename  values(23,‘sss‘)
      insert into tablename   values(33,‘sdfs‘)
      insert into tablename   values(33,‘4434‘)
      insert into tablename   values(45,‘dsdsd‘)
 
        select from  tablename  as  a where not exists (select from  tablename  where attachid=a.attachid and name<a.name)   
                                                 内层的    外层的       内层   外层
                                                 按某个字段去重              保留按某个字段排序的最大/小值
 
       后面括号里的意思是再从原表中找有没有比当前记录相同字段的比较字段更大或更小的 如果有  则不插入  如果没有  则插入
       exists   是个条件  后面的结果集有值的时候 条件成立   后面结果集为空的时候 条件不成立   所以后面子查询中select 后面跟什么字段不重要  关键是看结果集是否为空
      
       加not  是取相反的意思
       name <a.name 是取最小的     反之是取最大的
  
原数据
id  attachid name
1    23       sss
2    33       sdfs
3    33       4434
4    45       dsdsd
 
比较后
id          attachid    name
----------- ----------- ----------
1           23          sss
3           33          4434
4           45          dsdsd
 
注意:from后面不能跟别名只能跟临时表 #table
 
复杂一点的例子:
 查询 WorkFlowTask 表中 ReceiveID为某值 而且状态是2或者3的 记录  而且在同样GroupID 中只保留时间最新的  并且结果按完成时间排序

(select * from
( SELECT *,ROW_NUMBER() OVER(ORDER BY CompletedTime1 DESC) AS PagerAutoRowNumber
FROM WorkFlowTask
WHERE ReceiveID=‘00000000-0000-0000-0000-000000009667‘ AND [Status] IN(2,3) ) as a
where not exists  --其实后面只是一个查询条件(包含子查询)
        (select 1 from WorkFlowTask
           where GroupID=a.GroupID and ReceiveTime>a.ReceiveTime and ReceiveID=‘00000000-0000-0000-0000-000000009667‘ AND [Status] IN(2,3)
         )

 
 
 

sql 语句查询 按某字段去重 保留按某个字段排序top1