Oracle高级查询之OVER(PARTITION BY ..)(二)

2014-11-24 08:58:49 · 作者: · 浏览: 1
看了上面的语句后,大家是否也会觉得虚惊一场呢(惊出一身冷汗后突然鸡冻起来,这样容易感冒)?我们还是来讲解一下上面用到的两个新方法吧。
lead(列名,n,m): 当前记录后面第n行记录的<列名>的值,没有则默认值为m;如果不带参数n,m,则查找当前记录后面第一行的记录<列名>的值,没有则默认值为null。
lag(列名,n,m): 当前记录前面第n行记录的<列名>的值,没有则默认值为m;如果不带参数n,m,则查找当前记录前面第一行的记录<列名>的值,没有则默认值为null。
下面再列举一些常用的方法在该语法中的应用(注:带order by子句的方法说明在使用该方法的时候必须要带order by):
[sql]
select e.ename,
e.job,
e.sal,
e.deptno,
first_value(e.sal) over(partition by e.deptno) first_sal,
last_value(e.sal) over(partition by e.deptno) last_sal,
sum(e.sal) over(partition by e.deptno) sum_sal,
avg(e.sal) over(partition by e.deptno) avg_sal,
count(e.sal) over(partition by e.deptno) count_num,
row_number() over(partition by e.deptno order by e.sal) row_num
from scott.emp e;
重要提示:大家在读完本片文章之后可能会有点误解,就是OVER (PARTITION BY ..)比GROUP BY更好,实际并非如此,前者不可能替代后者,而且在执行效率上前者也没有后者高,只是前者提供了更多的功能而已,所以希望大家在使用中要根据需求情况进行选择。