在数据统计中,经常会有此类场景:
场景一:根据某列的上一行的数据进行下移一行后,进行比较
场景二:与场景一相反,根据某列的下一行数据进行上一一行后,进行比较
根据上述的两种场景,小编考虑使用两个分析函数来实现LAG()与LEAD()
由于LAG()与LEAD()的语法一致,因此只说明其中一个。
结构:
lag(value_expr [,offset][,default]) over([query_partition_clause] order by Order_by_clause)
参数说明:
value_expr 值表达式,通常是字段,也可是是表达式。value_expr本身不支持分析函数,也就是lead不支持多层调用。
offset 偏移,应该是很熟悉的数学概念了,或者是相对偏移,表格来开当前行的第offset行,如果offset是整数就表示是顺序下的前第n行,如果是负数就是往后第n行。 如果不提供这个参数,就是默认为1.
default 默认值,如果没有找到,应该返回什么值的意思,有点类似nvl(col,value)。如果没有设置,且找不到,那么就返回Null
over 理解成在一个结果集范围内,如果后面的partition by为空,那么就是当前的结果集范围内。
query_partition_clause 分区语句,对结果集合分区的语句,是可选的,如果没有就是所有的一个分区。
Order_by_clause 排序语句 必须需要 ,形如order by xxx desc/asc
1.创建表
CREATE TABLE TAB_DATA(
REGOIN VARCHAR2(20),
YEAR NUMBER,
PERSON NUMBER
)
2.插入数据
insert into TAB_DATA (REGOIN, YEAR, PERSON) values ('A地区', 2010, 200);
insert into TAB_DATA (REGOIN, YEAR, PERSON) values ('A地区', 2011, 210);
insert into TAB_DATA (REGOIN, YEAR, PERSON) values ('A地区', 2012, 222);
insert into TAB_DATA (REGOIN, YEAR, PERSON) values ('A地区', 2013, 230);
insert into TAB_DATA (REGOIN, YEAR, PERSON) values ('A地区', 2014, 260);
insert into TAB_DATA (REGOIN, YEAR, PERSON) values ('A地区', 2015, 275);
insert into TAB_DATA (REGOIN, YEAR, PERSON) values ('A地区', 2016, 310);
insert into TAB_DATA (REGOIN, YEAR, PERSON) values ('B地区', 2010, 100);
insert into TAB_DATA (REGOIN, YEAR, PERSON) values ('B地区', 2011, 110);
insert into TAB_DATA (REGOIN, YEAR, PERSON) values ('B地区', 2012, 115);
insert into TAB_DATA (REGOIN, YEAR, PERSON) values ('B地区', 2013, 150);
insert into TAB_DATA (REGOIN, YEAR, PERSON) values ('B地区', 2014, 154);
insert into TAB_DATA (REGOIN, YEAR, PERSON) values ('B地区', 2015, 180);
insert into TAB_DATA (REGOIN, YEAR, PERSON) values ('B地区', 2016, 200);
3.使用分析函数查询,查看效果
3.1.分析函数-LAG()
脚本:
SELECT REGOIN,YEAR,PERSON,
LAG(PERSON) OVER(PARTITION BY REGOIN ORDER BY REGOIN,YEAR)
FROM TAB_DATA;
显示结果:
3.2.分析函数-LEAD()
脚本:
SELECT REGOIN,YEAR,PERSON,
LEAD(PERSON) OVER(PARTITION BY REGOIN ORDER BY REGOIN,YEAR)
FROM TAB_DATA;
显示结果:
根据上面的分析函数,现在以上面的数据,要求完成此种业务:
按地区来计算每年人口的增长率?
文章中给的计算公式不一定正确,只为举例随便说的计算公式:
增长率的计算公式: (当前年的人口数-上一年的人口数)/((当前年的人口数+上一年的人口数)/2)
======================华丽分割线==========================
开始已上面的要求,使用LAG()函数来实现:
脚本:
SELECT REGOIN,YEAR,
(PERSON-LAG(PERSON,1,100) OVER(PARTITION BY REGOIN ORDER BY REGOIN,YEAR))/((PERSON+LAG(PERSON,1,100) OVER(PARTITION BY REGOIN ORDER BY REGOIN,YEAR))/2)
FROM TAB_DATA;
显示结果: