首页 > Linux操作系统 > Linux操作系统 > 前两天看到的几个分析函数
常用的分析函数如下所列:
row_number() over(partition by ... order by ... [null last])
rank() over(partition by ... order by ... [null last] )
dense_rank() over(partition by ... order by ... [null last] )
这三个函数用法相似,都可以用partition 分组,也可以不分组,这三个函数都会为每条记录产生一个从1开始至N的数字,并且返回值都是唯一的。但是也有些区别:
row_number,返回值唯一,当碰倒相同的数据时,排名按照记录集中记录的顺序一次递增。
row_number 没有重复值的,可以用它实现分页
densc_rank, 只有排序的值变化的时候,序号值才会加1,也就是说如果排序的值不变,序号也不变。 如果一个值相等,那他的序号也是相等, 两个第二名后面跟着第三名。
它的序号是:1 2 2 3
rank 除非遇到相同的数据时, 此时所有相同数据的排名是一样的,并且最后一条相同记录和下一条不同记录的排名之间空出排名。 通俗点就是两个第二名下面是第四名了。
rank 的排名是 1 2 2 4
count() over(partition by ... order by ...)
max() over(partition by ... order by ...)
min() over(partition by ... order by ...)
sum() over(partition by ... order by ...)
avg() over(partition by ... order by ...)
first_value() over(partition by ... order by ...)
last_value() over(partition by ... order by ...)
first_value和last_value的用法:返回结果集中排在第一位和最后一位的值.
用分析函数查找最近最新利率,费率等挺好的
lag() over(partition by ... order by ...)
lag(para1, para2, para3)
在一次查询中取出同一字段的前N行
para1 是从其他行返回的表达式
para2 是希望检索的当前行分区的偏移量。 是一个正的偏移量,是一个往回检索以前的行的数据
para3 是找不到指定偏移量值后的值
with a as (select 1 id,'a' name from dual
union
select 2 id,'b' name from dual
union
select 3 id,'c' name from dual
union
select 4 id,'d' name from dual
union
select 5 id,'e' name from dual
)
select id,name,lag(id,1,'')over(order by name) from a
lead() over(partition by ... order by ...)
在一次查询中取出同一字段的后N行
也可以对窗口范围进行定义:RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW.
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/21634752/viewspace-683685/ ,如需转载,请注明出处,否则将追究法律责任。