一、实现环比/同比计算

(1)利用窗函数实现同比环比计算

计算每月的销量情况的场景中,我们可以窗口函数Lag计算获得上个月的销量数据:

LAG(value, offset, DEFAULT) OVER ()

这个函数的功能就是返回与当前行向前偏移n行的目标行的数值,如LAG(sum(price), 1) OVER () 即可以获得前一行的销量数据。

而月环比的计算公式为 (当月销量-上月销量)/上月销量,SQL表示为:

(sum(price)-lag(sum(price),1) OVER ())/lag(sum(price),1) OVER ()

于是利用如下SQL就可以实现月环比分析:

select
month_id
,sum(price) as sales
,lag(sum(price),1) over () as sales_LM
,(sum(price)-lag(sum(price),1) over ())/lag(sum(price),1) over ()
as sales_MOM_PERCENTAGE
from sales_table
group by month_id
order by month_id

备注:当sales_LM 为空时,sales_MOM_PERCENTAGE为空,不会补充

(2)利用窗函数对不同区间的数据实现同比环比计算

在实际的分析场景中,进行同比环比计算时,分析师希望对数据进行分区分别计算同比环比,例如希望获得各产品分类下的月环比结果,此时需要在lag函数中定义具体计算的区间即:

lag(sum(price),1) over (partition by g.categ_lvl3_name order by c.month_id) as sales_LM

在partition by中定义categ_lvl3_name可以实现获取前一个月的销量时以产品分类单独进行计算,定义order by month_id 基于月份进行排序,然后取前一行的销量。如上所述我们可以用以下SQL计算出各产品分类下的同比及环比:

select categ_lvl3_name,month_id,sum(price) as sales,lag(sum(price),1) over (partition by categ_lvl3_name order by month_id) as sales_LM,(sum(price)-lag(sum(price),1) over (partition by categ_lvl3_name order by month_id))/lag(sum(price),1) over (partition by categ_lvl3_name order by month_id) as sales_MOM_PERCENTAGE
from sales_table_2
group by categ_lvl3_name,month_id
order by categ_lvl3_name,month_id

(3)利用窗口函数计算同比环比的局限

由于窗口函数lag计算同比环比时,函数只是单纯的按照用户指定的排序次序,找到前一行的值或前十二行的值,因此这种计算的准确是基于数据中包含每月的完整数据的前提下。如果某月份的数据缺失的话,就会造成向前找到上个月或一年前的值出错。

二、实现MTD/QTD/YTD计算

通过窗口函数实现MTD,QTD,YTD,如对于一个订单表order,可定义如下sql查询各Name分区下的MTD,QTD,YTD 金额。

select NAME as BUYER_ACCOUNT_NAME,PART_DT,MONTH_BEG_DT,QTR_BEG_DT,YEAR_BEG_DT,SUM(PRICE) as GMV,SUM(SUM(PRICE)) over (partition by NAME,MONTH_BEG_DT order by PART_DT )  GMV_MTD,SUM(SUM(PRICE)) over (partition by NAME,QTR_BEG_DT order by PART_DT )  GMV_QTD,SUM(SUM(PRICE)) over (partition by NAME,YEAR_BEG_DT order by PART_DT )  GMV_YTD
from order

备注

这里每条记录都会有基准列MONTH_BEG_DT、QTR_BEG_DT、YEAR_BEG_DT

例如: KYLIN_SALES_3

NAME PART_DT MONTH_BEG_DT QTR_BEG_DT YEAR_BEG_DT PRICE
hello 2019-01-01 2019-01-01 2019-01-01 2019-01-01 88.0
hello 2019-01-03 2019-01-01 2019-01-01 2019-01-01 89.0
hello 2019-01-04 2019-01-01 2019-01-01 2019-01-01 88.0

查询结果

NAME PART_DT MONTH_BEG_DT QTR_BEG_DT YEAR_BEG_DT GMV GMV_MTD GMV_QTD GMV_YTD
hello 2019-01-01 2019-01-01 2019-01-01 2019-01-01 88.0 88.0 88.0 88.0
hello 2019-01-03 2019-01-01 2019-01-01 2019-01-01 89.0 177.0 177.0 177.0
hello 2019-01-04 2019-01-01 2019-01-01 2019-01-01 88.0 265.0 265.0 265.0

三、参考

  • 使用Kyligence Analytics Platform 实现同比环比计算
  • Tableau技巧——快速计算同比和环比
  • 两招加速时间智能分析之 Tableau 篇

同环比与MTD/QTD/YTD月季年累计在查询引擎中的实现相关推荐

  1. 通过hive sql实现报表中的MTD,YTM,YTD

    MTD:例:20160918求20160901-20160918的amount的sum(累加) YTD: 例:20160918求20160101-20160918的amount的sum(累加) YTM ...

  2. 环信即时通讯SDK集成——实战:快速实现iOS应用中集成即时通讯IM和UI

    准备 熟练objective-c语言 有一台mac电脑,并安装了xcode 和 cocoapods 目标 手把手教大家在iOS应用中集成即时通讯IM 功能 内容篇幅较长,需要内心平和耐心看下去,务必戒 ...

  3. Linux和windows访问设备的方式比较

    LInux一直秉承着一切皆文件的理念,但是如何把设备当做文件来处理呢?Windows又是如何处理设备的呢?参照前辈的译文 查看全文 http://www.taodudu.cc/news/show-53 ...

  4. PART 5 多为数据透视分析

    总体要求 理解多维数据模型价值.理解多维数据模型逻辑.理解透视分析原理.能够活用多维数据模型结合恰当透视方法观测业务问题,实现商业洞察 1.多维数据模型概述 多维数据模型又叫多维数据集.立方体(Cub ...

  5. 从阿里核心场景看实时数仓的发展趋势

    简介:随着2021年双11的完美落幕,实时数仓技术在阿里双11场景也经历了多年的实践和发展.从早期的基于不同作业的烟囱式开发,到基于领域分层建模的数仓引入,再到分析服务一体化的新型融合式一站式架构,开 ...

  6. 大数据Hadoop、Hive、Kafka、Hbase、Spark等框架面经

    大数据组件 学习路线: 阶段1:学习绿色箭头的知识点: 阶段2:学习红色箭头的知识点: 阶段3:学习蓝色箭头的知识点: 1 Hadoop 1.1 Hadoop1.x与Hadoop2.x的区别 1.2 ...

  7. 数据仓库工程师面试题

    什么是数据仓库? 数据仓库,英文名称date warehouse 简称DW,数据仓库,就是一个很大的用来存储数据的集合,用于解决企业数据分析性和决策目的创建,对多样的数据进行筛选与整合,指导业务流程曾 ...

  8. 零距离接触阿里云时序时空数据库TSDB

    概述 最近,Amazon新推出了完全托管的时间序列数据库Timestream,可见,各大厂商对未来时间序列数据库的重视与日俱增. 阿里云TSDB是阿里巴巴集团数据库事业部研发的一款高性能分布式时序时空 ...

  9. 从方法到思维:什么是应用逻辑架构的正确姿势?

    Blog: https://blog.yilon.top 作者: 阿里技术 地址: https://zhuanlan.51cto.com/art/202004/613905.htm 本文分享阿里资深技 ...

最新文章

  1. 论天空、太空、航空、航天
  2. 「递归」第5集 | 从网瘾少年到极客大神:没有什么是一段代码解决不了的
  3. formidable ajax上传,nodejs+express+ajax实现图片上传及显示
  4. 【例题+习题】【数值计算方法复习】【湘潭大学】(四)
  5. java 父类this_java父类方法中使用this,可以把this强转为子类对象,然后调用子类的实例方法,怎么解释?...
  6. c函数sscanf的高级技巧
  7. Git学习03-----最基本的几个命令
  8. cron和crontab_Linux crontab命令创建和管理Cron作业
  9. 【MyBatis框架】Lombok插件的安装及使用
  10. 修改系统UISearchBar搜索框的样式-搜索图片、背景颜色
  11. Youtube 视频自动播放
  12. 怎么实现html网页爱心动态,想着网页上做动态爱心怎么做
  13. 斑马条码打印机常见故障大盘点
  14. android 代码保护 高级混淆
  15. 【图像处理】非线性滤波
  16. ECMAScript 2017(ES8)新特性简介
  17. PyTorch深度学习入门 || 系列(四)——非线性回归
  18. 函数式编程另类指南 (zz)
  19. 人工智能之数学基础篇—高等数学基础(下篇)
  20. ili9325显示方向反了(原点设置与方向设置)

热门文章

  1. 如何启动一个 kafka connector (步骤详解+问题解决)
  2. 进入华为软件 eNSP 学习的第一天
  3. 2020年金属非金属矿山(地下矿山)主要负责人考试题库及金属非金属矿山(地下矿山)主要负责人考试申请表
  4. 2009天心软件渠道合作伙伴招募计划(http://www.gz-sunlike.com/info.asp?article_id=557)
  5. Heartbeat安装
  6. 基于mpvue开发微信小程序,入门开发步骤
  7. 无刷云台之坐标转换篇
  8. Linux下的RSS阅读器(转)
  9. 利盟Lexmark P3120 打印机驱动
  10. 推荐算法基础--矩阵奇异值分解svd