ITPub博客

首页 > > > Sqlserver 使用row_number()over(partitioon by) 分组去重

Sqlserver 使用row_number()over(partitioon by) 分组去重

作者:飘絮絮絮丶 时间:2023-03-20 14:06:47 0 删除 编辑

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

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

但我们还想要实现这样的效果,这时我们可以用 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='李四'

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

一般将上述语句,看做为一个新表,如临时表,或外嵌查询 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

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

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

---取出去年一年内,医生下达最多的诊断,前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

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69946831/viewspace-3133993/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2019-09-09

  • 博文量
    2646
  • 访问量
    42171