当前位置:Gxlcms > 数据库问题 > sql 语句查询 按某字段去重 保留按某个字段排序top1

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

时间:2021-07-01 10:21:17 帮助过:5人阅读

例子:      建表: 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

标签:

人气教程排行