oracle lag與lead分析函式簡介
阿新 • • 發佈:2019-02-17
lag與lead函式是跟偏移量相關的兩個分析函式,通過這兩個函式我們可以取到當前行列的偏移N行列的值 lag可以看著是正的向上的偏移 lead可以認為負的向下的偏移 具體我們來看幾個例子:
我們先看下scott的emp表的兩列資料:
select deptno, sal from scott.emp order by deptno
DEPTNOSAL
102450.00
105000.00
101300.00
202975.00
203000.00
201100.00
20800.00
203000.00
301250.00
301500.00
301600.00
30950.00
302850.00
301250.00
ok那現在比方我有個這樣的需求(我們只看sal列)我想問你2450的上一個值是多少?回答是沒有 那5000的上一個值是多少?是:2450 1300的上一個值是多少呢?是:5000 Ok以此類推我想得到當前值的上一個值
就像:2450 xxx(xxx代表空)--這個值是前一列的上一個值
5000.002450
1300.005000
2975.001300
3000.002975
1100.003000
... ...
1250.00 2850
OK就這樣的需求 那我們現在用SQL應該如何寫呢?是的你猜對了就是用lag分析函式:
select deptno, sal a, lag(sal, 1, sal) b over(order by deptno)
from scott.emp
DEPTNOA
B
102450.002450 --ps:這裡的之所以是2450是因為lag(sal, 1, sal)我讓它給了他本身的值
105000.002450
101300.005000
202975.001300
203000.002975
201100.003000
20800.001100
203000.00800
301250.003000
301500.001250
301600.001500
30950.001600
302850.00950
301250.002850
是的就這麼簡單你看出A列與B列之間有何聯絡了吧 相對A列B列是她的上一個值
關於lead她就剛好與lag相反了
select deptno, sal a, lead(sal, 1, sal) over(order by deptno) b
from scott.emp
DEPTNOA
B
102450.005000
105000.001300
101300.002975
202975.003000
203000.001100
201100.00800
20800.003000
203000.001250
301250.001500
301500.001600
301600.00950
30950.002850
302850.001250
301250.001250
相對A列B列是她的下一個值
另外那個偏移值1是可以隨便取的如果是2那就是偏移兩個值了
select deptno, sal a, lag(sal, 2,null) over(order by deptno) b
from scott.emp
DEPTNOA
B
102450.00 --注意這裡是null空了
105000.00
101300.002450 --A列1300的上兩個值是多少?2450是吧
202975.005000
203000.001300
201100.002975
20800.003000
203000.001100
301250.00800
301500.003000
301600.001250
30950.001500
302850.001600
301250.00950
OK 那其實lag,lead還可以加上分組偏移的
select deptno,
sal a,
lag(sal, 1, null) over(partition by deptno order by deptno) b
from scott.emp
DEPTNOA
B
102450.00
105000.002450
101300.005000
202975.00
203000.002975
201100.003000
20800.001100
203000.00800
301250.00
301500.001250
301600.001500
30950.001600
302850.00950
301250.002850
注意deptno不同的分組間的臨界值你看明白了吧