博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
oracle中LAG()和LEAD()等分析统计函数的使用方法(统计月增长率)
阅读量:7119 次
发布时间:2019-06-28

本文共 2480 字,大约阅读时间需要 8 分钟。

LAG()和LEAD()统计函数能够在一次查询中取出同一字段的前N行的数据和后N行的值。这样的操作能够使用对同样表的表连接来实现,只是使用LAG和 LEAD有更高的效率。下面整理的LAG()和LEAD()样例:

LAG(EXPRESSION,<OFFSET>,<DEFAULT>)

SQL> select year,region,profit ,lag (profit,1) over (order by year)  as 51xit_exp from test;
YEAR REGION      PROFIT 51xit_exp
---- ------- ---------- -------------
2003 West            88
2003 West            88            88
2003 Central        101            88
2003 Central        100           101
2003 East           102           100
2004 West            77           102
2004 East           103            77
2004 West            89           103

LEAD(EXPRESION,<OFFSET>,<DEFAULT>)

SQL> select year,region,profit ,lead (profit,1) over (order by year)  as next_year_exp from test;
YEAR REGION      PROFIT NEXT_YEAR_EXP
---- ------- ---------- -------------
2003 West            88            88
2003 West            88           101
2003 Central        101           100
2003 Central        100           102
2003 East           102            77
2004 West            77           103
2004 East           103            89
2004 West            89

Lag函数为Lag(exp,N,defval),defval是当该函数无值可用的情况下返回的值。Lead函数的使用方法类似。

Lead和Lag函数也能够使用分组,下面是使用region分组的样例:
SQL> select year,region,profit , lag (profit,1,0) over (PARTITION BY region order by year)    as 51xit_exp from test;
YEAR REGION      PROFIT 51xit_exp
---- ------- ---------- -------------
2003 Central        101             0
2003 Central        100           101
2003 East           102             0
2004 East           103           102
2003 West            88             0
2003 West            88            88
2004 West            77            88
2004 West            89            77

一SQL问题解答:

问题:
CREATE   TABLE  ldy_temp_2
(
  分局    VARCHAR(255),
派出所    VARCHAR(255) ,
证件类型    VARCHAR(255) ,
证件号码    VARCHAR(255) ,
姓名    VARCHAR(255) ,
性别    VARCHAR(255) ,
行政区划    VARCHAR(255) ,
旅馆名称    VARCHAR(255) ,
旅馆地址    VARCHAR(255) ,
房间号    VARCHAR(255) ,
入住时间    VARCHAR(255) ,
col012    VARCHAR(255)
);

INSERT INTO LDY_TEMP_2

(证件号码,姓名,旅馆名称,入住时间)
VALUES('1234','ZHANGTAO','A','20100506');
INSERT INTO LDY_TEMP_2
(证件号码,姓名,旅馆名称,入住时间)
VALUES('1234','ZHANGTAO','A','20100507');
INSERT INTO LDY_TEMP_2
(证件号码,姓名,旅馆名称,入住时间)
VALUES('1234','ZHANGTAO','B','20100508');

INSERT INTO LDY_TEMP_2

(证件号码,姓名,旅馆名称,入住时间)
VALUES('1234','ZHANGTAO','A','20100509');
INSERT INTO LDY_TEMP_2
(证件号码,姓名,旅馆名称,入住时间)
VALUES('1235','ZZZZ','A','20100506');
INSERT INTO LDY_TEMP_2
(证件号码,姓名,旅馆名称,入住时间)
VALUES('1235','ZZZZ','B','20100507');
INSERT INTO LDY_TEMP_2
(证件号码,姓名,旅馆名称,入住时间)
VALUES('1235','ZZZZ','A','20100508');
INSERT INTO LDY_TEMP_2
(证件号码,姓名,旅馆名称,入住时间)
VALUES('1235','ZZZZ','B','20100509');

建表语句和測试数据已经给出  请问  怎样查找相邻两次入住旅馆名称不同的人;也就是说 一个人的证件号码是123的话 那么这个人的信息依照入住时间排序后  相邻两条数据的旅馆名称不能一样 。

解答:

with temp_a as
(select
        t.证件号码,
        t.旅馆名称,
        t.入住时间,
        lag(t.旅馆名称) over (partition by t.证件号码 order by t.入住时间) as lagname
from ldy_temp_2 t)
select 证件号码,姓名,旅馆名称,入住时间
from ldy_temp_2 a
where a.证件号码 not in (select b.证件号码 from temp_a b where  b.旅馆名称=b.lagname)

转载地址:http://fhnel.baihongyu.com/

你可能感兴趣的文章
Android应用程序插件化研究之DexClassLoader
查看>>
如何站在双11的肩膀上 详解阿里云企业级互联网架构
查看>>
记一次Spring Batch完整入门实践
查看>>
小程序登录及用户信息和手机号的获取
查看>>
[Vue] Computed property "XXX" was assigned to but it has no setter.
查看>>
设计模式系列之「装饰模式」
查看>>
OSI 七层网络协议的定义与理解
查看>>
Less(v3.9.0)使用详解—变量
查看>>
Javascript对象
查看>>
Spring Boot快速注册服务脚本
查看>>
JavaScript嵌套函数this的指向问题
查看>>
Spring Cloud教程 (二)应用程序上下文服务层次结构
查看>>
git commit 规范校验配置和版本发布配置
查看>>
iOS下JS与OC互相调用(四)--JavaScriptCore
查看>>
4. 怎么在生活中提升专注力?
查看>>
http请求/相应及如何在chrome中查看
查看>>
Docker最佳实践:构建最小镜像
查看>>
短视频直播&一对一源码“皇冠”花落谁家
查看>>
MySQL用户的增删改权以及root远程连接
查看>>
img元素srcset属性浅析
查看>>