oracle查询时单列去重和查询多列且对单列去重
oracle查询单列时去重,最常用的应该时distinct了
例如有如下的表(企业信息注册表),表中数据如下
- 查询单列并去重,如查询企业名称列corporname列,查看所有的企业名称
查询单列,用distinct就可以实现
2,如果想查询企业所有的信息 ,并根据企业名称去重,相同企业展示最新的注册时间registTime
这时候如果在使用distinc就实现不了,如下是使用distinct的结果,相同企业B,应该展示最新的注册时间20200422,但使用distinct并没有达到效果
select distinct t.corporname,t.corporid ,t.registtime from register t
当 distinct 作用在多个字段的时候,它只会将所有字段值都相同的记录“去重”掉,显然这里的企业B数据不满足此条件,其corporid和registtime不一致。
关键字 distinct 只能放在 SQL 语句中所有字段的最前面才能起作用,如果放错位置,SQL 执行时会报错,缺失表达式
如下:
3.使用rank() over()
这时候就需要用到rank() over()了,查询多列,并对其中一列按指定条件去重
语法 rank() over(partition by 列1 order by 列2 按列1分组,并在列1分组的基础上,对每个组按列b排名,默认升序(类似oralce分页中的rowid)
如下就可以实现查询企业所有的信息 ,并根据企业名称去重,相同企业展示最新的注册时间registTime
select corporid, corporname, registtime
from (select t.*,
rank() over(partition by t.corporname order by t.registtime desc) rn
from register t) k
where rn = 1
本文参考如下资源
https://blog.****.net/DavieSmile/article/details/89216441
https://www.cnblogs.com/mycoding/archive/2010/05/29/1747065.html