Orecle SQL查询每组最新的数据(可以多条)

今天的需求是表里有大量的重复字段,但是因为是每一次用户请求审核的结果,所以保存不能去重,只能取的时候按某一个id分组然后按时间获取最新的数据。

那么用什么函数能解决这个问题呢,答案是rank () over () 是对结果进行排序

怎么使用呢?

SELECT * FROM  (select ID,ruleid,createdate,
rank () over (partition by ruleid order by createdate nulls last) as rnk
from gsa_rule_result ) x where x.rnk=1

在没有使用分组前是重复的291条数据

使用上述Sql语句以后就根据id进行分组,分组以后少了一半

运行子查询以后看到根据ruleid进行分组,并根据时间排序以后有一个RNK字段进行的排序,每组最新的数据RNK都是1

Orecle SQL查询每组最新的数据(可以多条)_第1张图片

走到这里我们就好解决了,外层查询就查询RNK=1就ok了,下图成功查询每个ruleid最新的数据了。

Orecle SQL查询每组最新的数据(可以多条)_第2张图片

讲一下函数怎么使用把!

其中能起作用的就是这句:rank () over (partition by ruleid order by createdate nulls last) as rnk

其中 rank () over () 是排序的语法, partition by ruleid的意思是根据ruleid进行分组, order by createdate nulls last,根据时间排序,并把根据时间排序是空的数据放到最后,目的不影响结果。

rank () 排序是不连续的,比如有并列的数字21,21,下一个列的数字就不是22,而是23了

Orecle SQL查询每组最新的数据(可以多条)_第3张图片

使用dense_rank ()替换rank ()就是下图的结果,并列有两个21,下面的数字就是22,不是23,这叫排序是连续的

Orecle SQL查询每组最新的数据(可以多条)_第4张图片

over () 方法里可以使用partition(分区字段)也可以不使用,使用就是按某个字段进行分组。

查询了一下,发现mysql的分组排序也和oracle一样。

 

你可能感兴趣的:(Oracle)