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 1 from  tablename  where attachid=a.attachid and name

按某个字段去重              保留按某个字段排序的最大/小值

 

       后面括号里的意思是再从原表中找有没有比当前记录相同字段的比较字段更大或更小的 如果有  则不插入  如果没有  则插入

       exists   是个条件  后面的结果集有值的时候 条件成立   后面结果集为空的时候 条件不成立   所以后面子查询中select 后面跟什么字段不重要  关键是看结果集是否为空    

       加not  是取相反的意思

       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)
         )

 

你可能感兴趣的:(数据库)