Oracle的LAG和LEAD分析函数 Lag函数可以在一次查询中取出当前行的同一字段的前面第N行的数据。 Lead 函数可以在一次查询中取出当前行的同一字段的后 面第 N行的。 这种操作可以使用对相同表的表连接来实现,不过使用LAG和LEAD有更高的效率。 lag的语法如下:

Oracle的LAG和LEAD分析函数

Lag函数可以在一次查询中取出当前行的同一字段的前面第N行的数据。

Lead函数可以在一次查询中取出当前行的同一字段的后面第N行的值。

这种操作可以使用对相同表的表连接来实现,不过使用LAG和LEAD有更高的效率。

lag的语法如下:

lead的语法如下:

lead 和lag 的语法类似以下以lag为例进行讲解!

lag(exp_str,offset,defval) over()

exp_str 指的是要做对比的字段。

offset 是exp_str字段的偏移量,即 offset 为N ,指的是在表中从当前行位置向前数N行就是我们所要找的那一行了。

比如说,

在表中,假设当前我们说的当前行在表中排在第四行,则offset 为3时表示的是我们所要找的数据行就是表中的第一行(即4-3=1)。

offset的默认值为1!

lag()函数的返回值为在表中从当前行位置向前数N行的那一行上exp_str字段的值。

当在表中从当前行位置向前数N行已经超出了表的范围时,lag()函数将defval这个参数值作为函数的返回值。

比如说,

在表中,假设当前我们说的当前行在表中排在第四行,则offset 为6时表示的是我们所要找的数据行就是表中的第-2行(即4-6=-2),这就表示我们所要找的数据行不在表中已经超出表的范围了,所以lag()函数将defval这个参数值作为函数的返回值。

default 参数的默认值为空值null,即如果在lag()函数中没有显式设置default

参数值时lag()函数的返回值为空值null。

Lead函数的用法类似。

以下是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 --此时没有设置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)表示意义如下:

首先,我们要知道由于省略分组子句,所以当前组的范围为整个表的数据行,

然后,在当前组(此时为整个表的数据行)这个范围里执行排序(即order by salary),

最后,我们知道分析函数lag(sal)在当前组(此时为整个表的数据行)这个范围里的窗口范围为当前组的第一行到当前行,即分析函数lag(sal)在这个窗口范围执行。

参见:

oracle分析函数技术详解(配上开窗函数over())

Oracle分析函数ROW_NUMBER()|RANK()|LAG()使用详解

设置了default 值之后 第一行对应的值 为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分析函数

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函数也可以使用分组,以下是使用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>

使用分析函数的时候注意空值 或者null 给数据带来的影响,数据是否允许为空或者null计算的时候会导致一定的差错 比如 800-null 肯定为null!这个结果是否是应用想要的结果?

细心很重要!!尤其是在计算和钱有关的情况下!!

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

mysql lag和lead_Oracle的LAG和LEAD分析函数相关推荐

  1. oracle下lag和lead分析函数

    Lag和Lead分析函数可以在同一次查询中取出同一字段的前N行的数据(Lag)和后N行的数据(Lead)作为独立的列. 这种操作可以代替表的自联接,并且LAG和LEAD有更高的效率. 语法: [sql ...

  2. oracle的LAG和LEAD分析函数

    Lag和Lead函数可以在一次查询中取出同一字段的前N行的数据和后N行的值.这种操作可以使用对相同表的表连接来实现,不过使用LAG和LEAD有更高的效率. lag的语法如下: lead的语法如下: l ...

  3. LAG()和LEAD() 分析函数详解

    Lag和Lead分析函数可以在同一次查询中取出同一字段的前N行的数据(Lag)和后N行的数据(Lead)作为独立的列. 在实际应用当中,若要用到取今天和昨天的某字段差值时,Lag和Lead函数的应用就 ...

  4. lag和lead 分析函数

    oracle 的分析函数是非常好的一个功能,借助它们,我们可以很方便的实现一些特殊的语句需求,省去了自己实现的诸多麻烦.  今天用到了lag 和lead 这两个分析函数,稍稍整理一下. lag 和le ...

  5. oracle lag()_lead(),ORACLE中lag() lead()函数使用

    链接:http://www.xifenfei.com/784.html 标题:lag() lead()函数使用 作者:惜分飞版权所有[文章允许转载,但必须以链接方式注明源地址,否则追究法律责任.] 1 ...

  6. oracle lag使用情景,关于lag函数的用法

    参考oracle 10g手册,明白了lag函数的基本用法: LAG Syntax See Also:"Analytic Functions" for information on ...

  7. mysql lag over_lag函数(lag函数用法)

    SELECT lag(task_id, 1, null) over(PARTITION BY *** ORDER BY ***), lead(task_id, 1, null) over(PARTIT ...

  8. 【分析函数】Oracle分析函数之LAG和LEAD

    [分析函数]Oracle分析函数之LAG和LEAD Lag和Lead函数可以在一次查询中取出同一字段的前N行的数据和后N行的值.这种操作可以使用对相同表的表连接来实现,不过使用LAG和LEAD有更高的 ...

  9. Hive学习之路 (十六)Hive分析窗口函数(四) LAG、LEAD、FIRST_VALUE和LAST_VALUE

    数据准备 数据格式 cookie4.txt cookie1,2015-04-10 10:00:02,url2 cookie1,2015-04-10 10:00:00,url1 cookie1,2015 ...

最新文章

  1. 《BBN: Bilateral-Branch Network with Cumulative Learning for Long-Tailed Visual Recognition》笔记
  2. XFire下根据WSDL生成Client Stub,并测试Client
  3. 面试题——死锁的实现
  4. Mysql 零距离-入门(一)
  5. 同一主机的多个子进程使用同一个套接字_在操作系统中进程是如何通信的
  6. SpringBoot连接Redis服务出现Command timed out
  7. inputtextarea表单提示文字
  8. [Django]模型提高部分--聚合(group by)和条件表达式+数据库函数
  9. 试用版本重装系统才能用是怎么回事_电脑重装系统老是失败,到底是怎么回事?这种现象是第一次碰到!...
  10. android 设置-关于手机-连续点击版本 打开开发者模式的功能实现
  11. Spring Securiy +aouth2.0+jwt整合,实现鉴权登录
  12. ept技术_intel EPT 机制详解
  13. CNC:CNC计算机数控系统技术之数控仿真宏程序代码讲解、案例应用集合之详细攻略
  14. 35岁技术人如何转型做管理?mysql删除数据语句
  15. shell编程-数组的使用
  16. springboot---微信小程序上传文件(word/pdf文件)
  17. 《Python Excel 教程》
  18. 为什么你的蓝牙耳机总是出毛病,不好好反思一下这些问题吗?
  19. python朴素贝叶斯对wine_基于朴素贝叶斯对Wine数据集分类
  20. 高德地图开发(三、地图marker点标记)

热门文章

  1. VB standard-module bas文件 调用
  2. linux中的dns中的hint,DNS问题
  3. Android数据连接浅析
  4. Ai机器人可以入国籍、可以当主播,当然也可以当电销精英
  5. 第二章 Java基本语言
  6. Debian10 Centos7 ProxmoxVE 虚拟硬盘格式转换
  7. 高德地图之添加遮盖物
  8. 华为鸿蒙os安卓系统,华为鸿蒙OS:再见了,安卓!
  9. 一个平凡程序员的五年感悟:没有足够的付出,就没有热爱
  10. python批量修改文件名字为数字编号