热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

Oracle的lead和lag函数

lag和lead函数,用于取出数据的前n行的数据和后n行的数据,当然要和over(orderby)一起组合

lag和lead函数,用于取出数据的前n行的数据和后n行的数据,当然要和over(order by)一起组合

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。


推荐阅读
author-avatar
LoisWangol_326
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有