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

教为学: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函数:

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

LEAD函数:

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

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

用法详解

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

再来一个例子:

  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是可选的。

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

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

 

 

 

 

 

你可能感兴趣的:(教为学:Oracle SQL学习之路(二):分析函数之相邻)