`

教为学:Oracle SQL学习之路(二):分析函数之相邻

阅读更多
原帖地址:http://www.cnblogs.com/jiaoweixue/archive/2013/05/30/3107693.html
  1. 我坚信初学者更加明白初学者学习的困难在哪里。
  2. 我坚信最好的学习资料是自己亲手记录。
  3. 我坚信最好的学习方法是自己动手。
  4. 我坚信最好的检验方式就是能把自己所学到的东西转手教给别人。
  5. -----作者: 高鹏

    教为学:Oracle SQL学习之路(二):分析函数之相邻

    前言

    相邻是一种什么概念?

    数据库里面的相邻又是一种什么概念?

    相邻最典型的应用场景是什么?

    同比和环比的概念大家清楚否。

    同样先上例子:

    1. select deptno,ename,
    2. lag(ename,1,'AAA') over(partition by deptno order by ename) lower_name,
    3. lead(ename,1,'ZZZ') over(partition by deptno order by ename) higer_name
    4. from emp;

    结果如下:

    DEPTNO

    ENAME

    LOWER_NAME

    HIGER_NAME

    10

    CLARK

    AAA

    KING

    10

    KING

    CLARK

    MILLER

    10

    MILLER

    KING

    ZZZ

    20

    ADAMS

    AAA

    FORD

    20

    FORD

    ADAMS

    JONES

    20

    JONES

    FORD

    SCOTT

    20

    SCOTT

    JONES

    SMITH

    20

    SMITH

    SCOTT

    ZZZ

    30

    ALLEN

    AAA

    BLAKE

    30

    BLAKE

    ALLEN

    JAMES

    30

    JAMES

    BLAKE

    MARTIN

    30

    MARTIN

    JAMES

    TURNER

    30

    TURNER

    MARTIN

    WARD

    30

    WARD

    TURNER

    ZZZ

    在这里有必要把执行计划贴出来:

    1. Execution Plan
    2. ----------------------------------------------------------
    3. Plan hash value: 3145491563
    4.  
    5. ---------------------------------------------------------------------------
    6. | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
    7. ---------------------------------------------------------------------------
    8. | 0 | SELECT STATEMENT | | 15 | 135 | 4 (25)| 00:00:01 |
    9. | 1 | WINDOW SORT | | 15 | 135 | 4 (25)| 00:00:01 |
    10. | 2 | TABLE ACCESS FULL| EMP | 15 | 135 | 3 (0)| 00:00:01 |
    11. ---------------------------------------------------------------------------
    12.  
    13.  
    14. Statistics
    15. ----------------------------------------------------------
    16.      1 recursive calls
    17.      0 db block gets
    18.      7 consistent gets
    19.      0 physical reads
    20.      0 redo size
    21.    981 bytes sent via SQL*Net to client
    22.    420 bytes received via SQL*Net from client
    23.      2 SQL*Net roundtrips to/from client
    24.      1 sorts (memory)
    25.      0 sorts (disk)
    26.     14 rows processed

    我执行了两个相邻函数,可是执行计划和上一次一样。

    Syntax

    LAG函数:

    LEAD函数:

    同样,这两个函数的用法上是一致的,唯一不同的是结果。

    用法详解

    这两个函数都提供了在不使用自连接的情况下,访问表中多个行的路径。

    再来一个例子:

    1. select last_name,
    2.         department_id,
    3.         hire_date,
    4.         salary,
    5.         lag(salary,1,0) over(partition by department_id order by hire_date) as prev_sal
    6. from employees;

    结果如下(节选):

    LAST_NAME

    DEPARTMENT_ID

    HIRE_DATE

    SALARY

    PREV_SAL

    Whalen

    10

    2003-09-17

    4400

    0

    Hartstein

    20

    2004-02-17

    13000

    0

    Fay

    20

    2005-08-17

    6000

    13000

    Raphaely

    30

    2002-12-07

    11000

    0

    Khoo

    30

    2003-05-18

    3100

    11000

    Tobias

    30

    2005-07-24

    2800

    3100

    Baida

    30

    2005-12-24

    2900

    2800

    Himuro

    30

    2006-11-15

    2600

    2900

    Colmenares

    30

    2007-08-10

    2500

    2600

    LAG/LEAD(v, n, dv)里的n表示位移,必须是0或正整数,dv是在没有取到对应值时的默认值。n默认是1,dv默认是null。

    其中order by 是必须的paritition by是可选的。

    当然,其实这后面都是可以接多列的。

    执行计划之所以没有贴,是因为结果是一样的。

     

     

     

     

     

本文链接

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics