ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 分析函数LAG和LEAD

分析函数LAG和LEAD

原创 Linux操作系统 作者:lsmnlsmn 时间:2012-07-28 11:48:26 0 删除 编辑

分析函数LAGLEADORACLE8.1.6被引入,用于实现表内多行数据访问,而不必借助于自连接。

 

两个函数具有相同的语法。

LAG  (value_expression [,offset] [,default]) OVER ([query_partition_clause] order_by_clause)

LEAD (value_expression [,offset] [,default]) OVER ([query_partition_clause] order_by_clause)

value_expression——可以是列或内建函数,但不能是分析函数。

offset——需要同时访问的当前行前面或后面的行数,默认值为1

default——如果offset值过大,超出当前行所在组的最大数据行数,则使用该值代替offset。默认值为NULL

 

按照工资(SAL)排序查询EMP表,结果如下:

SELECT empno,

       ename,

       job,

       sal

FROM   emp

ORDER BY sal;

 

     EMPNO ENAME      JOB              SAL

---------- ---------- --------- ----------

      7369 SMITH      CLERK            800

      7900 JAMES      CLERK            950

      7876 ADAMS      CLERK           1100

      7521 WARD       SALESMAN        1250

      7654 MARTIN     SALESMAN        1250

      7934 MILLER     CLERK           1300

      7844 TURNER     SALESMAN        1500

      7499 ALLEN      SALESMAN        1600

      7782 CLARK      MANAGER         2450

      7698 BLAKE      MANAGER         2850

      7566 JONES      MANAGER         2975

      7788 SCOTT      ANALYST         3000

      7902 FORD       ANALYST         3000

      7839 KING       PRESIDENT       5000

 

LAG

用于访问前一行数据。下面的查询返回前一行的工资数,并取得当前行的工资与前一行的工资之差。

SELECT empno,

       ename,

       job,

       sal,

       LAG(sal, 1, 0) OVER (ORDER BY sal) AS sal_prev,

       sal - LAG(sal, 1, 0) OVER (ORDER BY sal) AS sal_diff

FROM   emp;

 

     EMPNO ENAME      JOB              SAL   SAL_PREV   SAL_DIFF

---------- ---------- --------- ---------- ---------- ----------

      7369 SMITH      CLERK            800          0        800

      7900 JAMES      CLERK            950        800        150

      7876 ADAMS      CLERK           1100        950        150

      7521 WARD       SALESMAN        1250       1100        150

      7654 MARTIN     SALESMAN        1250       1250          0

      7934 MILLER     CLERK           1300       1250         50

      7844 TURNER     SALESMAN        1500       1300        200

      7499 ALLEN      SALESMAN        1600       1500        100

      7782 CLARK      MANAGER         2450       1600        850

      7698 BLAKE      MANAGER         2850       2450        400

      7566 JONES      MANAGER         2975       2850        125

      7788 SCOTT      ANALYST         3000       2975         25

      7902 FORD       ANALYST         3000       3000          0

      7839 KING       PRESIDENT       5000       3000       2000

 

LEAD

用于访问后一行数据。下面的查询用于返回下一行的工资,并计算下一行和当前行的工资差。

SELECT empno,

       ename,

       job,

       sal,

       LEAD(sal, 1, 0) OVER (ORDER BY sal) AS sal_next,

       LEAD(sal, 1, 0) OVER (ORDER BY sal) - sal AS sal_diff

FROM   emp;

 

     EMPNO ENAME      JOB              SAL   SAL_NEXT   SAL_DIFF

---------- ---------- --------- ---------- ---------- ----------

      7369 SMITH      CLERK            800        950        150

      7900 JAMES      CLERK            950       1100        150

      7876 ADAMS      CLERK           1100       1250        150

      7521 WARD       SALESMAN        1250       1250          0

      7654 MARTIN     SALESMAN        1250       1300         50

      7934 MILLER     CLERK           1300       1500        200

      7844 TURNER     SALESMAN        1500       1600        100

      7499 ALLEN      SALESMAN        1600       2450        850

      7782 CLARK      MANAGER         2450       2850        400

      7698 BLAKE      MANAGER         2850       2975        125

      7566 JONES      MANAGER         2975       3000         25

      7788 SCOTT      ANALYST         3000       3000          0

      7902 FORD       ANALYST         3000       5000       2000

      7839 KING       PRESIDENT       5000          0      -5000

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/24867611/viewspace-737942/,如需转载,请注明出处,否则将追究法律责任。

下一篇: NULL相关的函数
请登录后发表评论 登录
全部评论

注册时间:2012-07-12

  • 博文量
    16
  • 访问量
    19733