mysql lag和lead_Oracle的LAG和LEAD分析函数
Oracle的LAG和LEAD分析函數(shù) Lag函數(shù)可以在一次查詢中取出當(dāng)前行的同一字段的前面第N行的數(shù)據(jù)。 Lead 函數(shù)可以在一次查詢中取出當(dāng)前行的同一字段的后 面第 N行的。 這種操作可以使用對相同表的表連接來實現(xiàn),不過使用LAG和LEAD有更高的效率。 lag的語法如下:
Oracle的LAG和LEAD分析函數(shù)
Lag函數(shù)可以在一次查詢中取出當(dāng)前行的同一字段的前面第N行的數(shù)據(jù)。
Lead函數(shù)可以在一次查詢中取出當(dāng)前行的同一字段的后面第N行的值。
這種操作可以使用對相同表的表連接來實現(xiàn),不過使用LAG和LEAD有更高的效率。
lag的語法如下:
lead的語法如下:
lead 和lag 的語法類似以下以lag為例進(jìn)行講解!
lag(exp_str,offset,defval) over()
exp_str 指的是要做對比的字段。
offset 是exp_str字段的偏移量,即 offset 為N ,指的是在表中從當(dāng)前行位置向前數(shù)N行就是我們所要找的那一行了。
比如說,
在表中,假設(shè)當(dāng)前我們說的當(dāng)前行在表中排在第四行,則offset 為3時表示的是我們所要找的數(shù)據(jù)行就是表中的第一行(即4-3=1)。
offset的默認(rèn)值為1!
lag()函數(shù)的返回值為在表中從當(dāng)前行位置向前數(shù)N行的那一行上exp_str字段的值。
當(dāng)在表中從當(dāng)前行位置向前數(shù)N行已經(jīng)超出了表的范圍時,lag()函數(shù)將defval這個參數(shù)值作為函數(shù)的返回值。
比如說,
在表中,假設(shè)當(dāng)前我們說的當(dāng)前行在表中排在第四行,則offset 為6時表示的是我們所要找的數(shù)據(jù)行就是表中的第-2行(即4-6=-2),這就表示我們所要找的數(shù)據(jù)行不在表中已經(jīng)超出表的范圍了,所以lag()函數(shù)將defval這個參數(shù)值作為函數(shù)的返回值。
default 參數(shù)的默認(rèn)值為空值null,即如果在lag()函數(shù)中沒有顯式設(shè)置default
參數(shù)值時lag()函數(shù)的返回值為空值null。
Lead函數(shù)的用法類似。
以下是lag例子:
SCOTT@ www.linuxidc.com> set pagesize 10000
SCOTT@ www.linuxidc.com> select ename,job,sal ,lag(sal) over(order by sal) last_sal from emp;
ENAME JOB SAL LAST_SAL
---------- --------- ---------- ----------
SMITH CLERK 800 --此時沒有設(shè)置default 值 則為空值
JAMES CLERK 950 800 --這里的800來自第一行字段sal里的值800
ADAMS CLERK 1100 950
WARD SALESMAN 1250 1100
MARTIN SALESMAN 1250 1250
MILLER CLERK 1300 1250
TURNER SALESMAN 1500 1300
ALLEN SALESMAN 1600 1500
CLARK MANAGER 2450 1600
BLAKE MANAGER 2850 2450
JONES MANAGER 2975 2850
SCOTT ANALYST 3000 2975
FORD ANALYST 3000 3000
KING PRESIDENT 5000 3000
14 rows selected.
注釋:
lag(sal) over(order by sal) 解釋
over(order by salary)表示意義如下:
首先,我們要知道由于省略分組子句,所以當(dāng)前組的范圍為整個表的數(shù)據(jù)行,
然后,在當(dāng)前組(此時為整個表的數(shù)據(jù)行)這個范圍里執(zhí)行排序(即order by salary),
最后,我們知道分析函數(shù)lag(sal)在當(dāng)前組(此時為整個表的數(shù)據(jù)行)這個范圍里的窗口范圍為當(dāng)前組的第一行到當(dāng)前行,即分析函數(shù)lag(sal)在這個窗口范圍執(zhí)行。
參見:
oracle分析函數(shù)技術(shù)詳解(配上開窗函數(shù)over())
Oracle分析函數(shù)ROW_NUMBER()|RANK()|LAG()使用詳解
設(shè)置了default 值之后 第一行對應(yīng)的值 為500:
SCOTT@ www.linuxidc.com> select ename,job,sal ,lag(sal,1,500) over(order by sal) last_sal from emp;
ENAME JOB SAL LAST_SAL
---------- --------- ---------- ----------
SMITH CLERK 800 500
JAMES CLERK 950 800
ADAMS CLERK 1100 950
WARD SALESMAN 1250 1100
MARTIN SALESMAN 1250 1250
MILLER CLERK 1300 1250
TURNER SALESMAN 1500 1300
ALLEN SALESMAN 1600 1500
CLARK MANAGER 2450 1600
BLAKE MANAGER 2850 2450
JONES MANAGER 2975 2850
SCOTT ANALYST 3000 2975
FORD ANALYST 3000 3000
KING PRESIDENT 5000 3000
14 rows selected.
指定offset的值為2時
SCOTT@ www.linuxidc.com> select ename,job,sal ,lag(sal,2) over(order by sal) last_sal from emp;
ENAME JOB SAL LAST_SAL
---------- --------- ---------- ----------
SMITH CLERK 800
JAMES CLERK 950
ADAMS CLERK 1100 800
WARD SALESMAN 1250 950
MARTIN SALESMAN 1250 1100
MILLER CLERK 1300 1250
TURNER SALESMAN 1500 1250
ALLEN SALESMAN 1600 1300
CLARK MANAGER 2450 1500
BLAKE MANAGER 2850 1600
JONES MANAGER 2975 2450
SCOTT ANALYST 3000 2850
FORD ANALYST 3000 2975
KING PRESIDENT 5000 3000
14 rows selected.
offset的值為3
SCOTT@ www.linuxidc.com> select ename,job,sal ,lag(sal,3) over(order by sal) last_sal from emp;
ENAME JOB SAL LAST_SAL
---------- --------- ---------- ----------
SMITH CLERK 800
JAMES CLERK 950
ADAMS CLERK 1100
WARD SALESMAN 1250 800
MARTIN SALESMAN 1250 950
MILLER CLERK 1300 1100
TURNER SALESMAN 1500 1250
ALLEN SALESMAN 1600 1250
CLARK MANAGER 2450 1300
BLAKE MANAGER 2850 1500
JONES MANAGER 2975 1600
SCOTT ANALYST 3000 2450
FORD ANALYST 3000 2850
KING PRESIDENT 5000 2975
14 rows selected.
使用lead分析函數(shù)
SCOTT@yangdb> select ename,job,sal ,lead(sal) over(order by sal) last_sal from emp;
ENAME JOB SAL LAST_SAL
---------- --------- ---------- ----------
SMITH CLERK 800 950
JAMES CLERK 950 1100
ADAMS CLERK 1100 1250
WARD SALESMAN 1250 1250
MARTIN SALESMAN 1250 1300
MILLER CLERK 1300 1500
TURNER SALESMAN 1500 1600
ALLEN SALESMAN 1600 2450
CLARK MANAGER 2450 2850
BLAKE MANAGER 2850 2975
JONES MANAGER 2975 3000
SCOTT ANALYST 3000 3000
FORD ANALYST 3000 5000
KING PRESIDENT 5000
14 rows selected.
SCOTT@yangdb> select ename,job,sal ,lead(sal,1) over(order by sal) last_sal from emp;
ENAME JOB SAL LAST_SAL
---------- --------- ---------- ----------
SMITH CLERK 800 950
JAMES CLERK 950 1100
ADAMS CLERK 1100 1250
WARD SALESMAN 1250 1250
MARTIN SALESMAN 1250 1300
MILLER CLERK 1300 1500
TURNER SALESMAN 1500 1600
ALLEN SALESMAN 1600 2450
CLARK MANAGER 2450 2850
BLAKE MANAGER 2850 2975
JONES MANAGER 2975 3000
SCOTT ANALYST 3000 3000
FORD ANALYST 3000 5000
KING PRESIDENT 5000
14 rows selected.
SCOTT@yangdb> select ename,job,sal ,lead(sal,2) over(order by sal) last_sal from emp;
ENAME JOB SAL LAST_SAL
---------- --------- ---------- ----------
SMITH CLERK 800 1100
JAMES CLERK 950 1250
ADAMS CLERK 1100 1250
WARD SALESMAN 1250 1300
MARTIN SALESMAN 1250 1500
MILLER CLERK 1300 1600
TURNER SALESMAN 1500 2450
ALLEN SALESMAN 1600 2850
CLARK MANAGER 2450 2975
BLAKE MANAGER 2850 3000
JONES MANAGER 2975 3000
SCOTT ANALYST 3000 5000
FORD ANALYST 3000
KING PRESIDENT 5000
SCOTT@yangdb> select ename,job,sal ,lead(sal,3) over(order by sal) last_sal from emp;
ENAME JOB SAL LAST_SAL
---------- --------- ---------- ----------
SMITH CLERK 800 1250
JAMES CLERK 950 1250
ADAMS CLERK 1100 1300
WARD SALESMAN 1250 1500
MARTIN SALESMAN 1250 1600
MILLER CLERK 1300 2450
TURNER SALESMAN 1500 2850
ALLEN SALESMAN 1600 2975
CLARK MANAGER 2450 3000
BLAKE MANAGER 2850 3000
JONES MANAGER 2975 5000
SCOTT ANALYST 3000
FORD ANALYST 3000
KING PRESIDENT 5000
14 rows selected.
lead 的offset N 是以記錄的第N行和第一做對比注意末尾的 null 值!
Lead和Lag函數(shù)也可以使用分組,以下是使用job 分組的例子:
SCOTT@yangdb> select ename,job,sal ,lead(sal,1) over(partition by job order by sal) last_sal from emp;
ENAME JOB SAL LAST_SAL
---------- --------- ---------- ----------
FORD ANALYST 3000 3000
SCOTT ANALYST 3000
SMITH CLERK 800 950
JAMES CLERK 950 1100
ADAMS CLERK 1100 1300
MILLER CLERK 1300
CLARK MANAGER 2450 2850
BLAKE MANAGER 2850 2975
JONES MANAGER 2975
KING PRESIDENT 5000
MARTIN SALESMAN 1250 1250
WARD SALESMAN 1250 1500
TURNER SALESMAN 1500 1600
ALLEN SALESMAN 1600
14 rows selected.
SCOTT@yangdb> select ename,job,sal ,lag(sal,1) over(partition by job order by sal) last_sal from emp;
ENAME JOB SAL LAST_SAL
---------- --------- ---------- ----------
FORD ANALYST 3000
SCOTT ANALYST 3000 3000
SMITH CLERK 800
JAMES CLERK 950 800
ADAMS CLERK 1100 950
MILLER CLERK 1300 1100
CLARK MANAGER 2450
BLAKE MANAGER 2850 2450
JONES MANAGER 2975 2850
KING PRESIDENT 5000
MARTIN SALESMAN 1250
WARD SALESMAN 1250 1250
TURNER SALESMAN 1500 1250
ALLEN SALESMAN 1600 1500
14 rows selected.
SCOTT@yangdb>
使用分析函數(shù)的時候注意空值 或者null 給數(shù)據(jù)帶來的影響,數(shù)據(jù)是否允許為空或者null計算的時候會導(dǎo)致一定的差錯 比如 800-null 肯定為null!這個結(jié)果是否是應(yīng)用想要的結(jié)果?
細(xì)心很重要!!尤其是在計算和錢有關(guān)的情況下!!
本文原創(chuàng)發(fā)布php中文網(wǎng),轉(zhuǎn)載請注明出處,感謝您的尊重!
總結(jié)
以上是生活随笔為你收集整理的mysql lag和lead_Oracle的LAG和LEAD分析函数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 手机网站支付(公钥证书方式)
- 下一篇: 15个nosql数据库