日期:2014-05-16  浏览次数:20358 次

oracle的lead和lag函数

lag和lead函数,用于取出数据的前n行的数据和后n行的数据,当然要和over(order by)一起组合
select id,name from dave
id name
4 SF
3 oracle
4 eygle
5 rman
4 export

dave表中有id和name的数据。lag函数是取出数据的前n行的数据,lead函数是取出数据的后n行的数据,直接在例子吧,简单明了
select id,name,lag(id,4) over (order by id) as v_ab from dave
id name v_ab
3 oracle
4 export
4 SF
4 eygle
5 rman 3

lag(id,n,values)才是整个lag的完整形式,其中的id是column_name,n就是前n行的,values就是缺省的值,如果省略n和values,默认n是1,values是null
其实完全可以理解n就是当前行的前n行的数据,如果有就显示,没有就显示values或者null值。上面的结果也可以解释了。
lag 函数后有个over(order by id)其中的order by让数据重新asc排序了,所以lag函数是必须建立在order by的情况下,当然也可以order by name,不过最后显示的结果都是先order by然后对其lead或者lag的n行
当然lead函数和lad基本一样,不同的是一个是前n行一个是后n行
select id,name,lead(id,4) over(order by id) as v_ab from dave
3 oracle 5
4 export
4 SF
4 eygle
5 rman

select id,name,lead(id,4) over(order by 1) as v_ab from dave
上面的order by 1对吗,有结果吗,对的也是有结果的。
select id,name from dave order by 2 排序了
ORDER BY 项必须是 SELECT-list 表达式的数目,也就是前面的select column的列的总数范围内。
select id,name from dave order by 3,此时oracle就会报错了,因为无法排序找不到第三列column。
但是下面的
select id,name,lead(id,4) over(order by id) as v_ab from dave,此时查看sql执行计划是有window sort的排序计划,windows sort是一个窗口数据的排序,执行效率比全局sort order by要高。
现在就关于order by的讨论就到这了,想用lead但是又不想通过order by来改变lead的值,就直接select id,name,lead(id,4) over(order by 1) as v_ab from dave。


参考至:http://blog.itpub.net/post/43172/521461

如有错误,欢迎指正

邮箱:czmcj@163.com