Lag和Lead分析函數可以在同一次查詢中取出N行的資料(Lag)和後N行的資料(Lead)作為獨立的列。
這種操作可以代替表的自聯接,并且LAG和LEAD有更高的效率。
查詢上一條
文法結構
lag(value_expr [,offset][,default]) over([query_partition_clause] order by Order_by_clause)
查詢下一條
文法結構
lead(value_expr [,offset][,default]) over([query_partition_clause] order by Order_by_clause)
參數說明:
value_expr 值表達式,通常是字段,也可是是表達式。value_expr本身不支援分析函數,也就是lead不支援多層調用。
offset 偏移,應該是很熟悉的數學概念了,或者是相對偏移,表格來開目前行的第offset行,如果offset是整數就表示是順序下的前第n行,如果是負數就是往後第n行。 如果不提供這個參數,就是預設為1.
default 預設值,如果沒有找到,應該傳回什麼值的意思,有點類似nvl(col,value)。如果沒有設定,且找不到,那麼就傳回Null
over 了解成在一個結果集範圍内,如果後面的partition by為空,那麼就是目前的結果集範圍内。
query_partition_clause 分區語句,對結果集合分區的語句,是可選的,如果沒有就是所有的一個分區。
如partition by columnName
order_by_clause 排序語句 必須需要 ,形如order by xxx desc/asc
例子:
查詢上一條,其中lagid隻是個列别名
select lag(id,1,null) over (order by topflag desc, orderflag desc) lagid, tmpa.*
from article tmpa
通過查詢誰的上一條是我,來查詢下一條
select tmplag.* from
(select lag(id,1,null) over (order by topflag desc, orderflag desc) lagid, tmpa.*
from article tmpa
where catalogid in (10652,10653,10654)) tmplag
where tmplag.lagid = 267045
查詢下一條,其中leadid隻是個列别名
select lead(id,1,null) over (order by topflag desc, orderflag desc) leadid, tmpa.*
from article tmpa
通過查詢誰的下一條是我,來查詢上一條
select tmplead.* from
(select lead(id,1,null) over (order by topflag desc, orderflag desc) leadid, tmpa.*
from article tmpa
where catalogid in (10652,10653,10654)) tmplead
where tmplead.leadid = 266168
參考:
oracle下lag和lead分析函數
http://blog.csdn.net/thinkscape/article/details/8290894
Oracle分析函數Lead() Lag()
http://soft.chinabyte.com/database/39/12601039.shtml