原帖地址:http://www.cnblogs.com/jiaoweixue/archive/2013/05/30/3107693.html
我坚信初学者更加明白初学者学习的困难在哪里。
我坚信最好的学习资料是自己亲手记录。
我坚信最好的学习方法是自己动手。
我坚信最好的检验方式就是能把自己所学到的东西转手教给别人。
-
-----作者: 高鹏
教为学:Oracle SQL学习之路(二):分析函数之相邻
前言
相邻是一种什么概念?
数据库里面的相邻又是一种什么概念?
相邻最典型的应用场景是什么?
同比和环比的概念大家清楚否。
同样先上例子:
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
结果如下:
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函数:
同样,这两个函数的用法上是一致的,唯一不同的是结果。
用法详解
这两个函数都提供了在不使用自连接的情况下,访问表中多个行的路径。
再来一个例子:
department_id,
hire_date,
salary,
lag(salary,1,0) over(partition by department_id order by hire_date) as prev_sal
结果如下(节选):
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分析函数详解 #### 一、Oracle分析函数概述 Oracle分析函数是在处理大量数据时进行高级数据分析的强大工具,主要用于在线分析处理(OLAP)场景。这类函数可以在单个SQL语句中对数据进行复杂的计算,包括...
Oracle分析函数是数据库管理系统Oracle中的一种高级SQL特性,它们在数据处理和分析中扮演着重要角色。分析函数允许用户在结果集的每一行上执行计算,不仅考虑当前行,还考虑了同一组内的其他行。这与传统的聚合函数...
分析函数作为Oracle数据库中一项高级功能,专为解决复杂报表统计需求设计,其核心优势在于能够对数据进行精细的分组处理后,计算基于这些分组的特定统计值。与传统的聚合函数不同,分析函数不仅能够实现分组统计,还...
### Oracle分析函数详解 #### 一、概述 Oracle分析函数是一种强大的工具,它允许用户对分组数据执行复杂的计算,并且能够返回多个结果行。这与传统的聚合函数(如`SUM`、`COUNT`等)形成鲜明对比,后者通常只针对...
### Oracle 查询相邻上下行值 #### 背景与需求 在处理时间序列数据或具有某种排序的数据时,经常需要查询某一行记录与其相邻行(前一行或后一行)的数据。这种需求在财务分析、时间序列分析等领域非常常见。例如,...
Oracle分析函数是数据库管理系统Oracle中的一种高级特性,自Oracle 8.1.6版本开始引入,主要用于处理复杂的聚合计算和数据分析任务。它们提供了一种更高效、更灵活的方式来执行诸如累计计算、分组内的百分比计算、前...
Oracle 分析函数是一种强大的SQL工具,它在Oracle数据库中用于处理复杂的分析操作,如累计计算、计算百分比、前N条记录查询以及移动平均数。分析函数是在Oracle 8.1.6版本引入的,目的是为了提高性能并解决无法通过...
Oracle分析函数是数据库查询中的一个强大工具,它们在处理数据集时提供了高级的聚合功能,可以对一组行进行计算,并返回单个值或一组值。分析函数与聚合函数(如SUM, AVG, COUNT等)类似,但有显著的区别:聚合函数...
通过学习和实践提供的SQL脚本,如“汇总报表开发过程学习研究.sql”和“分析sql.txt”,可以进一步加深对Oracle函数的理解和应用。 在日常工作中,可以结合各种工具,如SQL Developer、Toad等,来编写、测试和优化...
Oracle分析函数是数据库管理系统Oracle中的一个强大特性,自8.1.6版本开始引入,用于对数据集执行更复杂的聚合操作。与普通的聚合函数(如SUM、COUNT、AVG等)不同,分析函数允许在结果集中返回多行,而不是单行的汇...
### Oracle分析函数参考手册知识点详解 #### 一、Oracle分析函数概述 Oracle分析函数自8.1.6版本起引入,主要用于对数据进行更复杂的分析处理。与传统的聚合函数(如SUM, AVG等)不同,分析函数能够在分组的基础上...
SQL(Structured Query ...以上只是SQL学习笔记中的部分要点,实际应用中还需要结合具体数据库系统(如MySQL、Oracle、SQL Server等)的特点和最佳实践。通过持续学习和实践,才能真正精通SQL,成为数据管理的高手。
Oracle分析函数是数据库管理系统Oracle中的一种高级特性,用于对数据集进行分析操作,提供了一种高效、简洁的方式来处理复杂的数据分析任务。分析函数在Oracle 8i版本中首次引入,极大地简化了之前需要通过自连接、...
Oracle分析函数是数据库查询中非常强大的工具,它们用于处理复杂的报表和统计需求,特别是在在线分析处理(OLAP)环境中。分析函数与聚合函数的主要区别在于,聚合函数对每个组只返回一行结果,而分析函数则可以针对...
Oracle数据库系统是世界上最广泛使用的数据库管理系统之一,它包含了大量的内置函数,这些函数极大地增强了SQL查询的能力,提高了数据处理的效率。本篇文章将详细介绍Oracle数据库中的一些关键函数,并提供实际应用...
在SQL查询中,这通常通过JOIN操作或窗口函数实现,如示例中的LEFT JOIN,以获取相邻记录的数据。 2. **同比/环比**:同比是指当前数值与去年同期数值的比较,而环比则是与前一时期数值的比较。在SQL中,同比可通过...
Oracle 10g R2中的分析函数是数据库查询和数据处理的重要工具,它们允许用户在一组行上执行计算,而不仅仅是单行。...通过深入学习和实践,你将能够熟练地运用这些分析函数,优化你的SQL查询,从而提升整个系统的性能。
Oracle分析函数是数据库查询中的强大工具,它允许用户在数据集上执行复杂的分析操作,而不仅仅是简单的聚合。分析函数的特点在于它们能够对数据进行排序、筛选,并且可以在不同的分区、窗口和排序规则下运行,这使得...
3. **窗口函数**:Oracle 10g引入了窗口函数,如RANK()、ROW_NUMBER()、LEAD()和LAG(),这些函数在数据分析中非常有用,可以实现排序、计算排名、获取相邻行数据等功能。 4. **数据操作**:除了基本的INSERT、...
Oracle 从版本 8.1.6 开始引入了分析函数,极大地扩展了SQL查询的能力。 首先,让我们来看看一些常见的分析函数: 1. AVG:计算指定表达式在一组或数据窗口内的平均值。例如,`AVG(salary) OVER (PARTITION BY ...