前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >oracle中LAG()和LEAD()等分析统计函数的使用方法(统计月增长率)

oracle中LAG()和LEAD()等分析统计函数的使用方法(统计月增长率)

作者头像
全栈程序员站长
发布2022-07-14 18:01:30
8440
发布2022-07-14 18:01:30
举报

大家好,又见面了,我是全栈君

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)

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/117919.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021年12月,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档