若不是這次使用oracle lead,我還不會發現,原來還有這麼好用的東西。
oracle 統計分析函數 lead
文法結構:
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 可以簡單地翻譯為在什麼。。。的基礎之上
query_partition_clause 分區語句,對結果集合分區的語句,是可選的,如果沒有就是所有的一個分區。
Order_by_clause 排序語句 必須需要 ,形如order by xxx desc/asc
解釋樣本:
SQL> select * from test_value;
MONS JJR CJL CJJE
---------- ---------- ---------- ----------
200801 LZF 250 1999
200802 LZF 200 2000
200803 LZF 300 1000
200804 LZF 23 189
200805 LZF 356 456
200806 LZF 100 200
200807 LZF 600 700
200808 LZF 23 123
200809 LZF 400 500
9 rows selected
SQL>
SQL> select rownum 序號,Mons,cjl cjl_01,
2 lead(cjl,1) over (order by mons desc) cjl_02,
3 lead(cjl,2) over (order by mons desc) cjl_03,
4 lead(cjl,3) over (order by mons desc) cjl_04,
5 lead(cjl,4) over (order by mons desc) cjl_05,
6 lead(cjl,5) over (order by mons desc) cjl_06,
7 lead(cjl,6) over (order by mons desc) cjl_07,
8 lead(cjl,7) over (order by mons desc) cjl_08,
9 lead(cjl,8) over (order by mons desc) cjl_09
10 from test_value
序號 MONS CJL_01 CJL_02 CJL_03 CJL_04 CJL_05 CJL_06 CJL_07 CJL_08 CJL_09
---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ----------
9 200809 400 23 600 100 356 23 300 200 250
8 200808 23 600 100 356 23 300 200 250
7 200807 600 100 356 23 300 200 250
6 200806 100 356 23 300 200 250
5 200805 356 23 300 200 250
4 200804 23 300 200 250
3 200803 300 200 250
2 200802 200 250
1 200801 250
實踐使用樣本:
select id,lead(id,1)over(partition by call_req_id order by call_req_id ,id),type,analyst,time_stamp from act_log order by call_req_id ,id