教为学:Oracle SQL学习之路(二):分析函数之相邻
教为学:Oracle SQL学习之路(二):分析函数之相邻
前言
相邻是一种什么概念?
数据库里面的相邻又是一种什么概念?
相邻最典型的应用场景是什么?
同比和环比的概念大家清楚否。
同样先上例子:
结果如下:
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函数:
同样,这两个函数的用法上是一致的,唯一不同的是结果。
用法详解
这两个函数都提供了在不使用自连接的情况下,访问表中多个行的路径。
再来一个例子:
结果如下(节选):
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是可选的。
当然,其实这后面都是可以接多列的。
执行计划之所以没有贴,是因为结果是一样的。
我坚信最好的加明白初学者学习的困难在哪里。
我坚信最好的学学习方法是自己动手。
我坚信最好的检验方式就是能把自己所学到的东西转手教给别人。
-----作者: 高鹏