lead和lag函式

dotaddjj發表於2011-07-28

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。
當然總結歸總結,還是要多用,oracle就是一個不斷學習不斷否定自己堅定自己的過程吧!別的也一樣吧!再次感謝大家對俺的囉嗦!

[@more@]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25362835/viewspace-1053127/,如需轉載,請註明出處,否則將追究法律責任。

相關文章