暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle SQL小示例系列-分析函数

码蚁在线 2017-07-03
354

在数据统计中,经常会有此类场景:

场景一:根据某列的上一行的数据进行下移一行后,进行比较

场景二:与场景一相反,根据某列的下一行数据进行上一一行后,进行比较

根据上述的两种场景,小编考虑使用两个分析函数来实现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;

显示结果:


文章转载自码蚁在线,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论