绑定完请刷新页面
取消
刷新

分享好友

×
取消 复制
Sqlserver 使用row_number()over(partitioon by) 分组去重
2023-03-20 14:06:47

在查询数据时如果有重复,我们知道可以用 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

分享好友

分享这个小栈给你的朋友们,一起进步吧。

SQLServer
创建时间:2023-03-20 14:06:14
美国Microsoft公司推出的一种关系型数据库系统。SQL Server是一个可扩展的、高性能的、为分布式客户机/服务器计算所设计的数据库管理系统,实现了与WindowsNT的有机结合,提供了基于事务的企业级信息管理系统方案。
展开
订阅须知

• 所有用户可根据关注领域订阅专区或所有专区

• 付费订阅:虚拟交易,一经交易不退款;若特殊情况,可3日内客服咨询

• 专区发布评论属默认订阅所评论专区(除付费小栈外)

技术专家

查看更多
  • 飘絮絮絮丶
    专家
戳我,来吐槽~