分析函数和聚合函数相似,但是对于每一组记录,无论多少行,聚合函数只返回一行值,而分析函数对其中每一条记录都返回值。
1.排名
几种排名需求:
- 排名无并列,且每个排名与紧接着的下一个排名都是连续的;----row_number
- 排名有并列,且并列的排名与紧接着的下一个排名不连续;----rank
- 排名有并列,且并列的排名与紧接着的下一个排名连续;----dense_rank
-- 把2013年4月销售额的数据取出来,然后按照销售额的高低在每个部门进行各自的排序;
select dept_id,sale_date,goods_type,sale_cnt,
row_number()over(partition by dept_id order by sale_cnt desc) rn,
rank()over(partition by dept_id order by sale_cnt desc) rk,
dense_rank()over(partition by dept_id order by sale_cnt desc)drk
from lw_sales
where trunc(sale_date,'MM')=date'2013-04-01';
注:
-- 排名分析函数不需要参数
-- 排名分析函数里的order by 子句是必须的
– partition by 和 order by后均可跟多列
2.相邻
- lag是取到排序后当前记录之前的记录
- lead是取到排序后当前记录之后的记录
select dept_id,sale_cnt,
lag(sale_cnt,1,0)over(partition by dept_id order by sale_cnt) lower_cnt,
lead(sale_cnt,1,9999)over(partition by dept_id order by sale_cnt)
from lw_sales;
LAG/LEAD(v,n,dv)里的n表示位移,必须是0或正整数,dv是在没有取到对应值时的默认值。n默认是1,dv默认是null。
相邻类分析函数后面的order by子句是必须的。
partition by和order by后均可跟多列。
3.统计
见下篇文章……