天天看點

oracle查詢上一條(lag)、下一條(lead)

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