教为学: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 |
其中order by 是必须的paritition by是可选的。
当然,其实这后面都是可以接多列的。
执行计划之所以没有贴,是因为结果是一样的。
相关文章推荐
- 教为学:Oracle SQL学习之路(二):分析函数之相邻
- [Oracle]高效的SQL语句之分析函数(四)--lag()/lead()
- [Oracle]高效的SQL语句之分析函数(二)--max()
- Oracle分析函数学习笔记1
- [Oracle]高效的SQL语句之分析函数(四)--lag()/lead()
- Oracle分析函数学习笔记
- [Oracle]高效的SQL语句之分析函数(四)--lag()/lead()
- [Oracle]高效的SQL语句之分析函数(三)--row_number() /rank()/dense_rank()
- [Oracle]高效的SQL语句之分析函数(一)--sum()
- [Oracle]高效的SQL语句之分析函数(一)--sum()
- [Oracle]高效的SQL语句之分析函数(三)--row_number() /rank()/dense_rank()
- [Oracle]高效的SQL语句之分析函数(三)--row_number() /rank()/dense_rank()
- [Oracle]高效的SQL语句之分析函数(二)--max()
- Oracle 分析函数学习(二)
- [Oracle]高效的SQL语句之分析函数(二)--max()
- [Oracle]高效的SQL语句之分析函数(三)--row_number() /rank()/dense_rank()
- Oracle]高效的SQL语句之分析函数
- [Oracle]高效的SQL语句之分析函数--row_number() /rank()/dense_rank()
- [Oracle]高效的SQL语句之分析函数(二)--max()
- 数据库学习:oracle的递归写法,分析函数写法,以及teradata的取一定数量记录的写法