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

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是用来求结果集中前一个值作为新的列的值得一个函数,效率很高。可以利用此分析函数来秒求环比和同比的值,但这其中也有些问题。LAG分析函数语法结构如下:

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

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

问题:

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

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

解决方案:

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值