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

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

data_time

cc

2021-01-12

80

2021-01-11

60



2020-12-31

60



2020-12-12

40



2020-11-30

20

应展示为:

hive 季度最后一天 hive 上年末_hive 季度最后一天


实现思路

1.考虑临时表取出当月数据与上月同期数据

将规律数据与不规律数据分而治之,当月与历史月分开处理

关键函数:上月同期使用函数add_months获取,最后一天数据使用last_day获取

例1:

hive 季度最后一天 hive 上年末_获取数据_02

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

data_time

cc

2021-01-12

80

2020-12-12

40

2020-12-31

60

2020-11-30

20

难点在于:

1.获取数据上月同期数据,将数据规整后直接取出上月环比值;

2.数据排序后月数据2020-12-31会出现在2020-12-12前,如果通过2021-01-12获取前行的数据为2020-12-31

3.如何实现排序可以通过2021-01-12下行为2020-12-12,我采取的方式为数据双分组

例2:

步骤1:

求出

当月-当前日期数据与上月同期数据

历史月-最后一天数据

hive 季度最后一天 hive 上年末_大数据_03

数据为:

data_time

cc

2021-01-12

80

2020-12-31

60

2020-12-12

40

2020-11-30

20

步骤2:

通过over开窗函数,两次排序实现年月desc,同年月asc排序,并根据lead当前行求出往下一行数据

hive 季度最后一天 hive 上年末_hive 季度最后一天_04

data_time

cc

2021-01-12

80

2020-12-12

40

2020-12-31

60

2020-11-30

20

步骤3:

过滤掉2020-12-12数据,直接求出环比数据

hive 季度最后一天 hive 上年末_大数据_05

hive 季度最后一天 hive 上年末_大数据_06


场景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;