热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

利用Oracle分析函数LAG求时间段内的本期、同比、环比值

withtime_dimas(selectadd_months(add_months(date2013-7-1,-12),(rownum-1))dim_monthfromdualconnectbylevelmonths_between(date2014-1-1,date2012-7-1)+1)selectt.dim_month,t.c_count,nvl(t.ly_count,0)ly_count,nvl(t.lm_count,

with time_dim as (select add_months(add_months(date'2013-7-1',-12),(rownum-1)) dim_month from dual connect by level =months_between(date'2014-1-1',date'2012-7-1')+1)select t.dim_month, t.c_count, nvl(t.ly_count,0) ly_count, nvl(t.lm_count,

with time_dim as 
(select add_months(add_months(date'2013-7-1',-12),(rownum-1)) dim_month
   from dual connect by level <=months_between(date'2014-1-1',date'2012-7-1')+1)
select t.dim_month,
       t.c_count,
       nvl(t.ly_count,0) ly_count,
       nvl(t.lm_count,0) lm_count
  from
  (select t1.dim_month, 
          nvl(t2.c_count,0) c_count,
          lag(t2.c_count,1,0) over(order by t1.dim_month) ly_count,
          lag(t2.c_count,12,0) over(order by t1.dim_month) lm_count  
     from time_dim t1
     left join test_lzc t2
       on t1.dim_mOnth= t2.dim_month) t
 where t.dim_month between date'2013-7-1' and date'2014-1-1'
order by 1 desc;


Oracle 分析函数LAG是用来求结果集中前一个&#20540;作为新的列的&#20540;得一个函数,效率很高。可以利用此分析函数来秒求环比和同比的&#20540;,但这其中也有些问题。LAG分析函数语法结构如下:

LAG(EXPRESSION,[OFFSET],[DEFAULT]) OVER([PATITION BY COLUMN1...] ORDER BY COLUMN1...)

其中offset是偏移量,指的是在结果集中向前第OFFSET个&#20540;。

问题:

1、如果基表中有的月份缺失,那么他就会把缺失的那部分月份漏查,直接再找前一个的&#20540;。

2、如果加入了时间筛选那么最前面的&#20540;得环比&#20540;,和所有结果集中的同比&#20540;全会找不到。

解决方案:

初始化一个时间维度,与基表关联,补全所有的月份,缺失的月份数&#20540;&#20540;为零。 以销售额为例,SQL如下:

推荐阅读
author-avatar
湘西有堵墙
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有