oracle中LAG()和LEAD()等分析统计函数的使用方法(统计月增长率)
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)
相关文章
- 精彩Oracle水晶报表,高效率助力企业信息化发展(oracle水晶报表)
- 实现Oracle中随机抽取数据的方法(oracle随机抽取数据)
- 足提升提高Oracle数据库连接数的方法(oracle连接数满)
- 处理Oracle中处理空值为0的方法(oracle空为0)
- 探索Oracle中创建安全账户的方法(oracle创建账户)
- 多个Oracle实例的启动方法示例(oracle启动多个实例)
- 解决Oracle错误码的操作指南(oracle错误码)
- 学习Oracle:利用Oracle工具更高效地操作(oracle工具使用教程)
- Oracle导出表的语句实现方法(oracle导出表语句)
- 深入理解Oracle触发器类型(oracle触发器类型)
- Oracle 数据库操作指南:快速重命名表的方法(oracle重命名表)
- Oracle 的序列生成器及其用法(序列oracle)
- Oracle查询返回数据条数的方法(oracle查询条数)
- Oracle获取系统时间的方法探究(oracle获取系统时间)
- 解析 Oracle 中取整数部分的方法(oracle取整数部分)
- 提升Oracle索引效率的有效方法(oracle索引是否有效)
- 利用Oracle实现数据交换的高效方法(oracle交换数据)
- Oracle转换为整型数据的方法(oracle转整型)
- 方法Oracle数据库修改表结构的有效方法(oracle修改表结构的)
- 数据库Oracle关闭单节点数据库的方法(oracle 关闭单节点)
- Oracle共享池有多聪明(oracle共享池怎么算)
- 使用Ajax与Oracle实现极致可靠性开发(ajax oracle)
- 使用12801 Oracle提升数据库性能(12801 oracle)
- Oracle中使用降序排序实现数据从高到低的排序(oracle中降序排序)
- 统利用Oracle中的坐标系统改善定位精度(oracle中的坐标系)
- 方法Oracle数据库清除实践深入解析清除数据的方法(oracle中清除数据的)
- 使用掌握Oracle中If语句的使用方法(oracle中if的)
- Oracle查询多列同时去重的方法(oracle两列同时去重)
- Oracle中表单不显示的解决方法(oracle不显示表单)
- 解决Oracle中上下连接问题(oracle 上下连接)
- 修改Oracle数据库NLS参数的简单方法(oracle nls修改)
- Oracle GIS模块助力空间数据分析和可视化(oracle gis模块)