日常运营需要大量的数据用作业务分析以及决策,涉及的指标众多,最常见的指标类似销售的环比和同比。我们常用来计算环比和同比的公式如下:
环比增长率 =(当前周期数 - 上一周期数)/ 上一周期数 * 100% 同比增长率 =(当前周期数 - 历史同期数)/ 历史同期数 * 100%从以上公式可以看出,两个指标的计算需要知道当前周期数据、上一周期数据以及历史同期数。我们以月的维度来简单阐述下三个指标:当前周期的数据=当月1号至今的累计数据、上一周期数据=上月相同天数累计数据、历史同期数据=上一年同一月相同天数累计数据。如果是完整月份,则为两个满月的对比(注意存在大小月)。
上面描述的概念性的东西,相信大家都已经明白。下面进入本期主要内容,环比同比指标统计的实现设计。从上面的概念描述,我们可以概况性的看到,其实当前周期数、环比和同比的共通点是,均为时间范围内的数据统计,差异点是统计数据时间范围的不同。由此,我们设计了以下的时间范围R表来描述需求,以周月为例。
统计时间
类型
当前周期开始时间
当前周期结束时间
环比同期开始时间
环比周期结束时间
同比周期开始时间
环比周期结束时间
2020-10-02
周
2020-09-28
2020-10-02
2020-09-21
2020-09-25
2019-09-30
2019-10-04
2020-10-02
月
2020-10-01
2020-10-02
2020-09-01
2020-09-02
2019-10-01
2019-10-02
有了以上时间范围表,我们需要做的则是将业务数据根据不同的时间范围打宽,并且根据需求汇总。举实际栗子说明,我们有以下数据,需要汇总统计本周以及本月的累计数量。业务数据S表如下:
业务时间
业务编号
数量
2020-09-28
0000092201
50
2020-10-01
0000100101
100
2020-10-01
0000100102
200
2020-10-02
0000100201
80
2020-10-02
0000100202
60
……
……
……
……
……
……
结合统计时间范围R表,我们可方便的统计当前周期、环比和同比的累计数量,当前周期累计数量参考以下脚本,环比和同比累计数量可类似统计。
Select R.统计时间, R.类型, SUM(S.数量) AS 当前周期数量 FROM R LEFT JOIN S ON 1=1 Where R.统计时间=今日 AND S.业务时间 between R.当前周期开始时间 to R.当前周期结束时间 GROUP BY R.统计时间,R.类型数据统计完成后的下一步是呈现。在实际应用中,数据会达到亿级,为了提高读取性能,减少库表的关联聚合等操作,我们可将数据按如下库表设计存储,从实际应用场景统计,可满足90%以上的数据展示需求。
统计时间
类型
当前周期数据
环比周期数量
同比周期数量
2020-10-02
周
2020-10-02
月
回顾一下,以上描述的环比和同比数据统计思路,我们首先为批量业务数据打上相应的标记位,接着根据标志位做需求维度的汇总计算,最后按照大宽表的格式存储统计结果。数据标志位的思想,在一定程度上简化了数据统计思路,优雅的解决日常一些数据统计问题。
作者:江沛