1. 程式人生 > >oracle lag與lead分析函式簡介

oracle lag與lead分析函式簡介

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不同的分組間的臨界值你看明白了吧