SQL按某字段去重 保留按某个字段排序最大值

select * from tablename as a
where not exists (
select 1 from tablename as b
 where b.name=a.name and b.id>a.id)

talename:要去重复的表

name:需要去重复的字段,可以有多个字段

ID:取id字段最大

例子:

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<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)
         )
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Archie_java

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值