天天看点

oracle单列去重,oracle查询时单列去重和查询多列且对单列去重

oracle查询单列时去重,最常用的应该时distinct了

例如有如下的表(企业信息注册表),表中数据如下

oracle单列去重,oracle查询时单列去重和查询多列且对单列去重

查询单列并去重,如查询企业名称列corporname列,查看所有的企业名称

查询单列,用distinct就可以实现

oracle单列去重,oracle查询时单列去重和查询多列且对单列去重

2,如果想查询企业所有的信息 ,并根据企业名称去重,相同企业展示最新的注册时间registTime

这时候如果在使用distinc就实现不了,如下是使用distinct的结果,相同企业B,应该展示最新的注册时间20200422,但使用distinct并没有达到效果

select distinct t.corporname,t.corporid ,t.registtime from register t

oracle单列去重,oracle查询时单列去重和查询多列且对单列去重

当 distinct 作用在多个字段的时候,它只会将所有字段值都相同的记录“去重”掉,显然这里的企业B数据不满足此条件,其corporid和registtime不一致。

关键字 distinct 只能放在 SQL 语句中所有字段的最前面才能起作用,如果放错位置,SQL 执行时会报错,缺失表达式

如下:

oracle单列去重,oracle查询时单列去重和查询多列且对单列去重

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 byt.registtime desc) rn

from register t) k

where rn = 1

oracle单列去重,oracle查询时单列去重和查询多列且对单列去重

本文参考如下资源

https://blog.csdn.net/DavieSmile/article/details/89216441

https://www.cnblogs.com/mycoding/archive/2010/05/29/1747065.html