oracle-function-lag-lead
2015-10-20 06:20
351 查看
lag与lead函数是跟偏移量相关的两个分析函数,通过这两个函数我们可以取到当前行列的偏移N行列的值 lag可以看着是正的向上的偏移 lead可以认为负的向下的偏移 具体我们来看几个例子:
我们先看下scott的emp表的两列数据:
select deptno, sal from scott.emp order by deptno
DEPTNO
SAL
10
2450.00
10
5000.00
10
1300.00
20
2975.00
20
3000.00
20
1100.00
20
800.00
20
3000.00
30
1250.00
30
1500.00
30
1600.00
30
950.00
30
2850.00
30
1250.00
ok那现在比方我有个这样的需求(我们只看sal列)我想问你2450的上一个值是多少?回答是没有 那5000的上一个值是多少?是:2450 1300的上一个值是多少呢?是:5000 Ok以此类推我想得到当前值的上一个值
就像:2450 xxx(xxx代表空)--这个值是前一列的上一个值
5000.00 2450
1300.00 5000
2975.00 1300
3000.00 2975
1100.00 3000
... ...
1250.00 2850
OK就这样的需求 那我们现在用SQL应该如何写呢?是的你猜对了就是用lag分析函数:
select deptno, sal a, lag(sal, 1, sal) b over(order by deptno)
from scott.emp
DEPTNO
A B
10
2450.00 2450 --ps:这里的之所以是2450是因为lag(sal, 1, sal)我让它给了他本身的值
10
5000.00 2450
10
1300.00 5000
20
2975.00 1300
20
3000.00 2975
20
1100.00 3000
20
800.00 1100
20
3000.00 800
30
1250.00 3000
30
1500.00 1250
30
1600.00 1500
30
950.00 1600
30
2850.00 950
30
1250.00 2850
是的就这么简单你看出A列与B列之间有何联系了吧 相对A列B列是她的上一个值
关于lead她就刚好与lag相反了
select deptno, sal a, lead(sal, 1, sal) over(order by deptno) b
from scott.emp
DEPTNO
A B
10
2450.00 5000
10
5000.00 1300
10
1300.00 2975
20
2975.00 3000
20
3000.00 1100
20
1100.00 800
20
800.00 3000
20
3000.00 1250
30
1250.00 1500
30
1500.00 1600
30
1600.00 950
30
950.00 2850
30
2850.00 1250
30
1250.00 1250
相对A列B列是她的下一个值
另外那个偏移值1是可以随便取的如果是2那就是偏移两个值了
select deptno, sal a, lag(sal, 2,null) over(order by deptno) b
from scott.emp
DEPTNO A
B
10
2450.00 --注意这里是null空了
10
5000.00
10
1300.00 2450 --A列1300的上两个值是多少?2450是吧
20
2975.00 5000
20
3000.00 1300
20
1100.00 2975
20
800.00 3000
20
3000.00 1100
30
1250.00 800
30
1500.00 3000
30
1600.00 1250
30
950.00 1500
30
2850.00 1600
30
1250.00 950
OK 那其实lag,lead还可以加上分组偏移的
select deptno,
sal a,
lag(sal, 1, null) over(partition by deptno order by deptno) b
from scott.emp
DEPTNO
A B
10
2450.00
10
5000.00 2450
10
1300.00 5000
20
2975.00
20
3000.00 2975
20
1100.00 3000
20
800.00 1100
20
3000.00 800
30
1250.00
30
1500.00 1250
30
1600.00 1500
30
950.00 1600
30
2850.00 950
30
1250.00 2850
注意deptno不同的分组间的临界值你看明白了吧
PS:lag(sal)等同于lag(sal, 1, null),自行验证
我们先看下scott的emp表的两列数据:
select deptno, sal from scott.emp order by deptno
DEPTNO
SAL
10
2450.00
10
5000.00
10
1300.00
20
2975.00
20
3000.00
20
1100.00
20
800.00
20
3000.00
30
1250.00
30
1500.00
30
1600.00
30
950.00
30
2850.00
30
1250.00
ok那现在比方我有个这样的需求(我们只看sal列)我想问你2450的上一个值是多少?回答是没有 那5000的上一个值是多少?是:2450 1300的上一个值是多少呢?是:5000 Ok以此类推我想得到当前值的上一个值
就像:2450 xxx(xxx代表空)--这个值是前一列的上一个值
5000.00 2450
1300.00 5000
2975.00 1300
3000.00 2975
1100.00 3000
... ...
1250.00 2850
OK就这样的需求 那我们现在用SQL应该如何写呢?是的你猜对了就是用lag分析函数:
select deptno, sal a, lag(sal, 1, sal) b over(order by deptno)
from scott.emp
DEPTNO
A B
10
2450.00 2450 --ps:这里的之所以是2450是因为lag(sal, 1, sal)我让它给了他本身的值
10
5000.00 2450
10
1300.00 5000
20
2975.00 1300
20
3000.00 2975
20
1100.00 3000
20
800.00 1100
20
3000.00 800
30
1250.00 3000
30
1500.00 1250
30
1600.00 1500
30
950.00 1600
30
2850.00 950
30
1250.00 2850
是的就这么简单你看出A列与B列之间有何联系了吧 相对A列B列是她的上一个值
关于lead她就刚好与lag相反了
select deptno, sal a, lead(sal, 1, sal) over(order by deptno) b
from scott.emp
DEPTNO
A B
10
2450.00 5000
10
5000.00 1300
10
1300.00 2975
20
2975.00 3000
20
3000.00 1100
20
1100.00 800
20
800.00 3000
20
3000.00 1250
30
1250.00 1500
30
1500.00 1600
30
1600.00 950
30
950.00 2850
30
2850.00 1250
30
1250.00 1250
相对A列B列是她的下一个值
另外那个偏移值1是可以随便取的如果是2那就是偏移两个值了
select deptno, sal a, lag(sal, 2,null) over(order by deptno) b
from scott.emp
DEPTNO A
B
10
2450.00 --注意这里是null空了
10
5000.00
10
1300.00 2450 --A列1300的上两个值是多少?2450是吧
20
2975.00 5000
20
3000.00 1300
20
1100.00 2975
20
800.00 3000
20
3000.00 1100
30
1250.00 800
30
1500.00 3000
30
1600.00 1250
30
950.00 1500
30
2850.00 1600
30
1250.00 950
OK 那其实lag,lead还可以加上分组偏移的
select deptno,
sal a,
lag(sal, 1, null) over(partition by deptno order by deptno) b
from scott.emp
DEPTNO
A B
10
2450.00
10
5000.00 2450
10
1300.00 5000
20
2975.00
20
3000.00 2975
20
1100.00 3000
20
800.00 1100
20
3000.00 800
30
1250.00
30
1500.00 1250
30
1600.00 1500
30
950.00 1600
30
2850.00 950
30
1250.00 2850
注意deptno不同的分组间的临界值你看明白了吧
PS:lag(sal)等同于lag(sal, 1, null),自行验证
相关文章推荐
- Oracle数据库数据丢失恢复的几种方法总结
- ORACLE 超长字符串问题的解决办法
- Linux 下安装 Oracle
- ORACLE EXP/IMP的使用详解
- Oracle 11g R2 安装时提示找不到em.ear
- rhel6 安装 oracle 11g rac
- Oracle数据类型
- 误操作删除数据文件恢复案例讨论
- Oracle 如何修改列的数据类型
- 在oracle linux 6.7升级gcc,从4.4.7到5.2.0
- ORA- 12012 : err or on aut o execu te of job ORACLE_OCM. MGMT_CONFIG_JOB_2_1 ORA-29280: inval
- oracle之子查询、连接查询、递归查询
- python连接oracle
- Oracle函数之LAG与LEAD
- ORACLE EXECUTE IMMEDIATE 'DML' 不能自动提交COMMIT 'DDL'触发COMMIT
- oracle 快速删除大批量数据方法(全部删除,条件删除,删除大量重复记录)
- oracle 创建表空间,用户
- oracle11g dataguard中standby库文件坏块的修复过程
- Oracle左外连接、右外连接、全外连接
- oracle课堂收录-过程中的事务处理