根据id去重_Sqlserver 使用row_number()over(partitioon by) 分组去重

47c0d5cdc1382fda01a7272838d4a6be.png

在查询数据时如果有重复,我们知道可以用 distinct 去除重复值,但使用 distinct 只能去除所有查询列都相同的记录,如果有一个字段不同,distinct 就无法去重。如

select  ID , 编码, 姓名 from person where 姓名='李四'

1ef817566600d758ec5b1e9f42fac197.png

但我们还想要实现这样的效果,这时我们可以用 row_number()over(partitioon by column1 order by column2) 先进行分组。根据 COLUMN1 分组,在分组内部根据 COLUMN2 排序,结果表示为每组内部排序后的顺序编号,这个编号在组内是连续且唯一的。

select  ID , 编码, 姓名 
,ROW_NUMBER()over(partition by 姓名 order by ID desc) as new_id --对姓名进行分组,对id进行从大到小排序
from person where name='李四'

4c30e3220f12e4f7e73fb5304b2e4f1d.png

再根据新生成的唯一值作为条件,取出每组中的某个值。通常情况下取最大值或最小值,其它情况看需求。

一般将上述语句,看做为一个新表,如临时表,或外嵌查询 select。以临时表为例。

select  ID , 编码, 姓名 
,ROW_NUMBER()over(partition by 姓名 order by ID desc) as new_id --对姓名进行分组,对id进行从大到小排序
into #aa
from person where name='李四'

再通过 where 条件取 new_id=1 的值

select * from #aa where new_id=1

f4663c4ab4fdac8dc73b674754c1d64b.png

放一个昨天晚上写的,稍微复杂点的语句。就是为了去除重复值。将重复值分组,按最大值排序,取第一条。

欢迎路过的大佬,批评指正,和指点优化。

---取出去年一年内,医生下达最多的诊断,前30条
select top 30 COUNT(VAO01) qt,VAO15 into #ww
from VAO1 
where 
VAO11=1 
and VAO25='1' 
and VAO22='1'
and IAA01='137'
and ACF01=1
and VAO19 between '2018-01-01 00:00:00.000' and '2019-01-01 00:00:00.000'
group by VAO15
order by COUNT(VAO01) desc

---根据下达最多诊断,取出患者本次就诊的ID,即vaa07
select distinct VAA07,VAO15,convert(varchar(100),VAO19,112) sj into #qq 
from VAO1 
where VAO11=1 and VAO25='1' 
and VAO19 between '2018-01-01 00:00:00.000' and '2019-01-01 00:00:00.000'
and VAO22='1'
and IAA01='137'
and ACF01=1
order by VAA07

---通过vaa07,获取到本次消费金额
select a.VAA07,VAA05,VAA03,sum(VAJ38) je,c.VAO15,bck03  into #ee
from  VAJ1 a join VAA1 b on a.VAA01=b.VAA01
join #qq c on c.VAA07=a.VAA07
join #ww e on e.vao15=c.VAO15
join BCK1 d on d.BCK01=a.BCK01C
where VAJ05=2 
group by a.VAA07,VAA05,VAA03,c.VAO15,bck03
order by VAO15

--通过row_number()over(partition by..)对消费金额进行排序,并插入到临时表
select VAA07,VAA05,VAA03,je,VAO15,BCK03
,ROW_NUMBER() OVER (partition by a.vao15 order by je desc) as new_index 
into #rr
from #ee a  
order by a.je desc

---用where条件取出消费金额最大
select vaa05 ,vaa03 ,BBY04 ,BBY05 ,BCK03 ,VAJ38 ,VAO15 ,VAJ47 
from vaj1 a 
join bby1 b on a.bby01=b.bby01
join (select  * from #rr where new_index =1) c on c.VAA07=a.VAA07
where  VAJ05=2
order by VAO15


drop table #qq
drop table #ww
drop table #ee
drop table #rr
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值