Oracle分析函数RANK(),ROW_NUMBER(),LAG()等的使用方法

 oracle分析函数rank(),row_number(),lag()等的使用方法


 row_number() over (partition by col1 order by col2)

 表示根据col1分组,在分组内部根据 col2排序
 而这个值就表示每组内部排序后的顺序编号(组内连续的唯一的)

 

 rank() 类似,不过rank 排序的时候跟派名次一样,可以并列2个第一名之后 是第3名

 

 lag 表示 分组排序后 ,组内后面一条记录减前面一条记录的差,第一条可返回 null

 

 btw: expert one on one 上讲的最详细,还有很多相关特性,文档看起来比较费劲

 

 row_number()和rownum差不多,功能更强一点(可以在各个分组内从1开时排序)


rank()是跳跃排序,有两个第二名时接下来就是第四名(同样是在各个分组内)


dense_rank()是连续排序,有两个第二名时仍然跟着第三名。


相比之下row_number是没有重复值的


lag(arg1,arg2,arg3):


arg1是从其他行返回的表达式


arg2是希望检索的当前行分区的偏移量。是一个正的偏移量,时一个往回检索以前的行的数目。


arg3是在arg2表示的数目超出了分组的范围时返回的值。

 

以下是我多表查询时用到,因为有些记录的id是相同,而我只需要取出最后一条即可。

select * from (
select distinct bb01.abz001 abz001,bb01.aab004 aab004,bb96.abb531 abb531,
row_number() over(partition by bb01.abz001 order by bb96.abb531 desc) number1
from bb01 left join bb96 on bb96.Abz001 = bb01.Abz001
Where bb96.abb534='01')
where number1=1;

 

abz001是编号,abb531是顺序

注意:1.条件 bb96.abb534='01' 放在where 跟on后面是不同的,可以参考前面博客内容

         2.我给每个字段一个别名,因为刚开始写的时候没别名出错,不过后来去掉也不报错了,所以如果有些人写的时候字段无法识别是可以加个别名。

 

你可能感兴趣的:(oracle)