您的位置:首页 > 数据库 > Oracle

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

2014-09-02 00:00 639 查看

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

前言

相邻是一种什么概念?

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

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

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

同样先上例子:

select
deptno,ename,

lag(ename,1,'AAA') over(partition by deptno order by ename) lower_name,

lead(ename,1,'ZZZ') over(partition by deptno order by ename) higer_name

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
在这里有必要把执行计划贴出来:

Execution Plan

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

Plan hash value: 3145491563

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

| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |

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

| 0 | SELECT STATEMENT | | 15 | 135 | 4 (25)| 00:00:01 |

| 1 | WINDOW SORT | | 15 | 135 | 4 (25)| 00:00:01 |

| 2 | TABLE ACCESS FULL| EMP | 15 | 135 | 3 (0)| 00:00:01 |

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

Statistics

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

1 recursive calls

0 db block gets

7 consistent gets

0 physical reads

0 redo size

981 bytes sent via SQL*Net to client

420 bytes received via SQL*Net from client

2 SQL*Net roundtrips to/from client

1 sorts (memory)

0 sorts (disk)

14 rows processed

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

Syntax

LAG函数:



LEAD函数:



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

用法详解

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

再来一个例子:

select
last_name,

department_id,

hire_date,

salary,

lag(salary,1,0) over(partition by department_id order by hire_date) as prev_sal

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

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

执行计划之所以没有贴,是因为结果是一样的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: