oracle lag()和lead()
来源: 阅读:953 次 日期:2015-04-01 16:51:25
温馨提示: 小编为您整理了“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)

更多信息请查看IT技术专栏

更多信息请查看数据库
手机网站地址:oracle lag()和lead()
由于各方面情况的不断调整与变化, 提供的所有考试信息和咨询回复仅供参考,敬请考生以权威部门公布的正式信息和咨询为准!
关于我们 | 联系我们 | 人才招聘 | 网站声明 | 网站帮助 | 非正式的简要咨询 | 简要咨询须知 | 加入群交流 | 手机站点 | 投诉建议
工业和信息化部备案号:滇ICP备2023014141号-1 云南省教育厅备案号:云教ICP备0901021 滇公网安备53010202001879号 人力资源服务许可证:(云)人服证字(2023)第0102001523号
云南网警备案专用图标
联系电话:0871-65317125(9:00—18:00) 获取招聘考试信息及咨询关注公众号:
咨询QQ:526150442(9:00—18:00)版权所有:
云南网警报警专用图标
Baidu
map