lag分析函數本身是用來取下一個記錄,即錯位,可以設置錯位的位數,lag分析函數的語法&作用:
lag(t.cur_value, 1)表示把t.cur_value這列錯位一行重新生成一列,
lag(t.cur_value, 2)表示錯兩行,
lag(t.cur_value, 0)表示不錯行(完全複製該列生成另外一列),默認錯位一行(一般用來查找前一天,前一個月等數據,用來算環比,同比等);
距離如下:
SQL> select * from lyq_test1 order by 1;
ID NAME
---------- ------------------------------
1 sagasgh
1 ljigusdhgiu
1 siduyg
2 uygg
2 iuyjhih
3 aaa
3 bbb
3 ccc
8 rows selected.
運用lag分析函數後:
SQL> select id,name,lag(id) over(order by id) as new_id from lyq_test1 order by 1;
ID NAME NEW_ID
---------- ------------------------------ ----------
1 sagasgh
1 ljigusdhgiu 1
1 siduyg 1
2 uygg 1
2 iuyjhih 2
3 aaa 2
3 bbb 3
3 ccc 3
8 rows selected.
Elapsed: 00:00:00.01
說明:可以看到新的id列的值向後移了一位。
使用lag分析函數實現sqlplus的break功能,具體如下:
SQL> select decode(lag(id) over(order by id) ,id,to_number(null),id) new_id,name from lyq_test1 ;
NEW_ID NAME
---------- ------------------------------
1 sagasgh
ljigusdhgiu
siduyg
2 uygg
iuyjhih
3 aaa
bbb
ccc
8 rows selected.
Elapsed: 00:00:00.01
還有一種方法是通過rownum的方法,也挺新奇的。詳見itpub連接 源於itpub上的一個帖子:http://www.itpub.net/thread-1356352-1-1.html