HIVE关于环比数据实现的方法

HIVE关于环比数据实现同期比值的方法

本篇介绍同期环比与月份环比之间比较的SQL写法
场景1:同期环比
最近在解决业务需求时,遇到了hiveSQL里面关于同期数据的环比计算。
业务场景为:
按月份计算数据及其对应的环比数据,月份数据展示为最后一天数据信息
如当前一月则一月当日与十二月同期比较,十二月月末与十一月月末比较
环比计算公式为
当前时间计算:
(当前时间数据-上月同期数据)/上月同期数据
历史时间计算:
(上月月末数据-上上月末数据)/上上月末数据
数据存放为:
表A存放每日数据(每日为当月累计数据,即2号为1号加2号数据),月份数据展示为最后一天数据信息。
字段:时间(data_time),数据量cc

data_timecc
2021-01-1280
2021-01-1160
2020-12-3160
2020-12-1240
2020-11-3020

应展示为:
数据计算
实现思路
1.考虑临时表取出当月数据与上月同期数据
将规律数据与不规律数据分而治之,当月与历史月分开处理
关键函数:上月同期使用函数add_months获取,最后一天数据使用last_day获取
例1:
在这里插入图片描述

2.考虑将数据全部排序后取排序数据
使用hive的自带函数lead结合开窗函数取出数据与上月对应数据
关键函数:上月同期使用函数add_months获取,最后一天数据使用last_day获取,lead往下行数获取数据,使用over开窗分组排序
数据格式取值需求为:

data_timecc
2021-01-1280
2020-12-1240
2020-12-3160
2020-11-3020

难点在于:
1.获取数据上月同期数据,将数据规整后直接取出上月环比值;
2.数据排序后月数据2020-12-31会出现在2020-12-12前,如果通过2021-01-12获取前行的数据为2020-12-31
3.如何实现排序可以通过2021-01-12下行为2020-12-12,我采取的方式为数据双分组
例2:
步骤1:
求出
当月-当前日期数据与上月同期数据
历史月-最后一天数据
求出当前时间与上月数据

数据为:

data_timecc
2021-01-1280
2020-12-3160
2020-12-1240
2020-11-3020

步骤2:
通过over开窗函数,两次排序实现年月desc,同年月asc排序,并根据lead当前行求出往下一行数据
在这里插入图片描述

data_timecc
2021-01-1280
2020-12-1240
2020-12-3160
2020-11-3020

步骤3:
过滤掉2020-12-12数据,直接求出环比数据
在这里插入图片描述

在这里插入图片描述
场景2:每月环比
1.自关联表
with tmp1 as (
select
substr(data_time,1,7) data_time,
max(cc) cc
from A
group by substr(data_time,1,7)
)
select
t1.data_time,
t1.cc,
(t1.cc-t2.cc)/t2.cc
from
tmp1 t1 join tmp2 t2
on t1.data_time=substr(add_months(concat(t2.data_time,’-01’),1),1,7)
2.临时表加1月
with tmp1 as (
select
substr(data_time,1,7) data_time,
max(cc) cc
from A
group by substr(data_time,1,7)
),
tmp2 as (–使用加一个月记录上月数据,关联时月份相同即可
select
substr(add_months(concat(t2.data_time,’-01’),1),1,7),
cc
from tmp1
)
select
t1.data_time,
t1.cc,
(t1.cc-t2.cc)/t2.cc
from
tmp1 t1 join tmp2 t2
on t1.data_time=t2.data_time;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值