在做数据分析时,我们会经常听到同比、环比同比的概念。各个企业和组织在发布统计数据时,通常喜欢用同比、环比来和之前的历史数据进行比较,用来说明数据的变化情况。例如,统计局公布2022年1月份CPI同比增长0.9%,环比增长0.6%。

实际中,在基于数据库的数据分析场景中,环比和同比是典型的复杂计算场景之一,特别是在Oracle等商业数据库的分析函数出现之前。以MySQL为例,在8.0版本中才引入了Lag和Lead函数,这两个函数结合开窗函数有效的提高了同比、环比等复杂运算的实现效率。在5.x系列版本中,MySQL需要依赖多次嵌套子查询和自关联才能实现此类计算。

我们以一个简单的例子,来分别看下,MySql 5.x和8.0是具体实现同比、环比计算的。

示例数据见表:

CREATE TABLE sales  (`产品ID` varchar(20),`销售数量` int(20) ,`销售时间` timestamp(6) NULL DEFAULT NULL
)
INSERT INTO sales VALUES ('C1001', 15, '2020-06-01 10:10:12');
INSERT INTO sales VALUES ('C1002',26, '2020-05-02 0:10:12');
INSERT INTO sales VALUES ('C1003', 21, '2020-04-03 0:10:12');
INSERT INTO sales VALUES ('C1003', 23, '2020-04-04 0:10:12');
INSERT INTO sales VALUES ('C1003', 0, '2020-03-05 0:10:12');
INSERT INTO sales VALUES ('C1001', 16, '2020-02-06 3:0:12');
INSERT INTO sales VALUES ('C1002', 32, '2020-01-07 0:10:12');
INSERT INTO sales VALUES ('C1001', 16, '2019-12-08 0:12:24');
INSERT INTO sales VALUES ('C1001', 32, '2019-06-09  0:12:24');
INSERT INTO sales VALUES ('C1002', 17, '2019-05-09 0:12:24');

1、MySQL 5.x :通过子查询和关联实现同比和占比计算

以按年月统计不同年份的销售总值,并计算环比(销售总额同比上期)、同比(销售总额同比去年同期)为例。

示例表结构和数据

通过SQL计算环比和同比:

select  year(c.销售时间) yy,month(c.销售时间) mm,
concat(ifnull(abs(round((sum(c.销售数量)-ss1)/ss1*100,2)),0),'%') 同比,
concat(ifnull(abs(round((sum(c.销售数量)-ss2)/ss2*100,2)),0),'%')  环比
from sales c
left join (select month(a.销售时间) mm1,year(a.销售时间) yy1,sum(a.销售数量) ss1from sales aGROUP BY mm1,yy1) aon month(c.销售时间) = a.mm1 and a.yy1 = year(c.销售时间)-1     left join  (select month(a.销售时间) mm2,year(a.销售时间) yy2,sum(a.销售数量) ss2from sales aGROUP BY mm2,yy2) b
on (b.yy2 = year(c.销售时间) and b.mm2+1 = month(c.销售时间) OR (yy2=year(c.销售时间)-1
AND b.mm2 = 12 AND month(c.销售时间) = 1))group by yy, mmorder by yy,mm asc

计算结果:

2、 MySQL 8.0 :通过分析函数实现同比和占比计算**

MySql8.0支持了Lead和Lag分析函数,虽然可以大幅提高同、环比计算的效率,但仍然需要编写SQL语句处理。

2、1 计算同比

select t2.年份,t2.月份,concat(round((t2.数量-t1.数量)/t1.数量,2)*100,'%') as 同比 from (
SELECT year(销售时间) as 年份,month(销售时间) as 月份,sum(销售数量) as 数量 from sales
group by year(销售时间),month(销售时间) order by year(销售时间) desc, month(销售时间) desc
) t1
,(
SELECT year(销售时间) as 年份,month(销售时间) as 月份,sum(销售数量) as 数量 from sales
group by year(销售时间),month(销售时间) order by year(销售时间) desc, month(销售时间) desc
) t2 where t1.年份=t2.年份-1 and t1.月份=t2.月份

2、2计算环比

SELECTmm,CONCAT(ROUND(IFNULL((xl - first_xl) / first_xl * 100,2),0),'%') AS 环比
FROM(SELECTmm,xl,lead (xl, 1) over (ORDER BY mm DESC) AS first_xlFROM(SELECTDATE_FORMAT(销售时间, '%Y-%m') AS mm,sum(销售数量) AS xlFROMsalesGROUP BYDATE_FORMAT(销售时间, '%Y-%m')) t) a

在SqlServer2008R2和Oracle10g之后,都提供了Lag和Lead分析函数。具体的计算逻辑和用法与上述MySQL8.0类似。

3、使用 BI工具的计算引擎

针对此类复杂的计算场景,商业智能BI数据分析工具提供了更加高效的解决方案。以Wyn Enterprise嵌入式商业智能软件为例,其内置的wax分析表达式和快速计算引擎,提供直接实现同比、环比等复杂计算的能力,而不再需要写复杂冗长的SQL。

3、1 使用内置的同比、环比快速计算功能**

同比、环比等计算一般是BI工具的标准功能,我们可以直接通过设置实现。

3、2 使用数据分析表达式

如果内置的快速计算无法满足要求,还可以通过分析表达式实现更复杂的计算。分析表达式是一种更加灵活、强大的数据计算方式,通过丰富的函数,用户可以像Excel公式一样自由组合,实现更加强大的分析能力。分析表达式基于数据模型进行业务计算,以一些定义好的函数运用正确的语法来完成某个复杂的业务逻辑计算。这样可以使用户更灵活的地使用数据,最大限度的利用数据。

各位老板们,通过对比SQL和BI数据分析工具在处理同比、环比等复杂计算中的差异,我们可以发现,还是专业的工具在数据计算和处理能力上要更加便捷。以后在工作中,如果有类似的分析计算需求,选择BI分析工具来处理就是再合适不过的了。

实现同比、环比计算的N种姿势相关推荐

  1. 怎么做蒙特卡洛计算npv_PowerBI非标准日历下的同比环比计算,你知道怎么做吗?...

    ​对于按照自然年月日来分析的业务数据,在PowerBI中可以轻松的使用时间智能函数来进行各种时间指标的计算,但如果不是按标准的日历,很多人就开始有点懵,不知道该如何计算了. 比如有的公司的业务月份是从 ...

  2. 计算同比 环比_PowerBI学习教程(三)时间累积同比环比计算

    YOY 同比增长率( Year Over Year): 按年度计的增长率 MOM 环比增长率 (Month Over Month): 按月度计的增长率 YTD 年累计 (Year to Date): ...

  3. java时间计算同比环比周的问题

    问题描述: 在业务中会有传不同日期格式, 1.有天(2020-02-29),周(2020-03第三周),月(2020-02二月份), 2.同时需要计算对应的去年同比时间和环比(就是上一个时间段,周的2 ...

  4. 【Mysql实战】使用存储过程和计算同比环比

    背景 同环比,是基本的数据分析方法.在各类调研表中屡见不鲜,如果人工向前追溯统计数据,可想而知工作量是非常大的. 标题复制10行,并且每行大于10个字符[源码解析]SpringBoot接口参数[Mys ...

  5. 同比环比日期计算、本周一、本周日、上周一、上周日(mysql)

    目录 1 所需基础日期查询实现 2 根据业务表实际查询操作 2.1 简单查询 2.2 查询优化: 2.3  在mybatis中 查询,关联业务信息实现 1 所需基础日期查询实现 (1)在计算同比环比时 ...

  6. 用MDX进行同比及环比计算

    同比和环比计算是企业应用.电子商务应用中常用的计算方法,也是常用的数据分析手段.写这篇文章也是因为最近在学习MDX相关的一些计算方法的同时回想到原来我在项目中使用过的一些类似的,利用SQL来完成的统计 ...

  7. EasyExcel第三弹 + hutool-poi 配合使用导出较复杂Excel.xlsx + 计算增长率、同比环比、比重等

    一.回顾 继上次"动态表头easyExcel导入导出(https://blog.csdn.net/qq_37337660/article/details/114680512)", ...

  8. 异常检测方法——DBSCAN、孤立森林、OneClassSVM、LOF、同比环比、正态分布、箱线图

    异常检测方法 基于时间序列分析 同比环比 基于统计 单特征且符合正态分布 基于统计 箱线图 基于聚类 DBSCAN 基于树模型 孤立森林 基于线性模型 OneClassSVM 基于密度 LOF 异常检 ...

  9. 数仓工具—Hive实战之占比同比环比(10)

    同比环比的计算 测试数据 1,2020-04-20,420 2,2020-04-04,800 3,2020-03-28,500 4,2020-03-13,100 5,2020-02-27,300 6, ...

  10. 使用 SQL 实现同比环比分析

    场景描述 在做数据分析时,经常会需要展示同比和环比的数据,可以通过 SQL 来完成同比和环比的计算,再配合数据可视化工具进行展示,每个月都会自动展示当月数据与上月的对比(环比),以及当月数据与去年同期 ...

最新文章

  1. 在 Ubuntu Linux 下搜索文件和文件内容
  2. java numberutil_NumberUtil
  3. ADO.NET Entity Data Model入门实例
  4. 水平居中布局与滚动条跳动的千年难题
  5. caffe 在 windows 使用
  6. JAVA 类加载 随记
  7. 2021-2025年中国中子发生器行业市场供需与战略研究报告
  8. JSP听课笔记(一)
  9. 雷达威力图绘制matlab,用Matlab语言实现雷达探测范围图的绘制
  10. Spring整合FreeMarker生成静态页面(静态模板)
  11. 数据介绍 | 长序列归一化植被指数NDVI
  12. Si523超低功耗带自动寻卡13.56MHz非接触式读写器 替代MFRC523
  13. holdpwd php,PHPMyWind后台管理界面的SQL注入漏洞 - 网站安全
  14. 苹果手机照片误删如何找回
  15. 父进程退出后,子进程自动消亡
  16. Linux at命令定时发送邮件具体用法
  17. 自制Chrome绿色版
  18. 后悔当初学php,中佛网-法师开示:当初为了家庭而丢了事业,现后悔不已,该怎么办?...
  19. 关于hibernate中invers跟cascade的一点看法
  20. [nrf51] BLE DFU:Dual Bank 备份升级 OTA

热门文章

  1. vue 使用html自带title属性 鼠标悬浮展示内容 修改其样式
  2. 深入dwr2-commet模式
  3. 上传图片时出现http 415错误
  4. 腾讯计算机编程本科年薪,腾讯程序员年薪80万,却感慨:天花板太低,想放弃工作去读研!...
  5. 模拟大规模电动车充电行为(Matlab实现)
  6. 【毕业设计】深度学习YOLO抽烟行为检测 - python opencv
  7. z反变换计算机控制,计算机控制4.Z变换.ppt
  8. 【day23】The field file exceeds its maximum permitted size of 1048576 bytes.
  9. 9.屏幕宽高比判断(Screen.width,Screen.height)
  10. 【数学建模】二手房房价影响因素分析(描述性统计+推断统计综合应用、线性回归预测分析)