增量/存量数据按时间维度分组

数据统计分析常用的统计方式:

1、存量:系统在某一时间点下数据在某个条件下的总数;

例:

需求:假设房源状态流转为:上架->下架->上架  (形成闭环) ,按日的维度统计时间范围内每天处于上架状态的存量房源数量

        设计中间表(time 时间 , nums 上架房源数量)用来给用户统计用。因为是按日分组,所以每一天都会对应有处于上架状态的存量房源的数量。因此这里每天都会生成一行记录,且该行的数据继承于昨天的数据,如 2号的上架状态的房源数据=1号上架的房源数据+2号新增上架的房源数-下架数。因此:新增上架的房源数时 数量加1,新增下架房源数时减1

 

这里选取1月1号为初始节点,这时候处于上架状态房源总数为 10 套


时间上架房源数量
2012-01-0110

 

1月2号,此时新上架了 20套

时间上架房源数量
2012-01-0230

 

1月3号,此时新上架了 10套 下架了15套

 

时间上架房源数量
2012-01-0325


说明:

当按日分组统计每天处于状态的房源总数时:select 上架房源数量  from t_housing group by 时间

   数据获取

      在第二天统计前一天处于上架状态的房源数,如1月1号的数据则在1月2号凌晨通过定时任务,执行统计数据的sql将1月1号的数据查出来之后,再放入中间表里。每次需要统计的时候,再从中间表中执行SQL 获得统计好的数据(类似SQL为:insert(time,nums) value(now(),select count(*) from t_housing where status = '上架'))

优点

  • 该方法将统计的数量与具体的房源隔离开,不需要关心系统的房源总数,只需要一年生成365条记录即可
  • 可以兼容 按月统计、按年统计(统计最后一天)
 
缺点
 
  • 如果需要同时查询房源的其他属性时,则一年的数据量与该属性的总数成正比。如:同时需要增加查询条件—小区,假设有1000个小区,那么数量级将增加1000倍(上架时某房源时,需要找到房源所在的小区的行,再把该房源数量加1)

    如:

    时间小区名称上架房源数量
    2012-01-03小区A5
    2012-01-03小区B7
    2012-01-03.....9
    2012-01-03小区Z10



  • 扩展性不好,如果需要临时增加查询条件,无法兼容之前的数据
  • 闭环的状态增加了对同一行数据的写(如:房源中的上架与下架,下架时,需要将数量减 1)
 

2、流量:是指在某一段时间内流入/出系统的数量

3、增量:则是指在某一段时间内系统中增加的数量

4、增量=流入量 - 流出量

5、本期期末存量=上期期末存量+本期内增量

6、拉链表:记录数据变化的完整状态

例:

假设订单状态流转为   创建订单→支付完成→已出库

 

6月20号有3条记录:

订单创建日期订单编号订单状态
2012-06-20001创建订单
2012-06-20002创建订单
2012-06-20003支付完成


到6月21日,表中有5条记录:

订单创建日期订单编号订单状态
2012-06-20001支付完成(从创建到支付)
2012-06-20002创建订单
2012-06-20003支付完成
2012-06-21004创建订单
2012-06-21005创建订单

 

到6月22日,表中有6条记录:

 

订单创建日期订单编号订单状态
2012-06-20001支付完成(从创建到支付)
2012-06-20002创建订单
2012-06-20003已发货(从支付到发货)
2012-06-21004创建订单
2012-06-21005支付完成(从创建到支付)
2012-06-22006创建订单

 

数据仓库中对该表的保留方法:

 

  1. 只保留一份全量,则数据和6月22日的记录一样,如果需要查看6月21日订单001的状态,则无法满足;
  2. 每天都保留一份全量,则数据仓库中的该表共有14条记录,但好多记录都是重复保存,没有任务变化,如订单002,004,数据量大了,会造成很大的存储浪费;

 

如果在数据仓库中设计成历史拉链表保存该表,则会有下面这样一张表:

订单创建日期订单编号订单状态dw_begin_datedw_end_date
2012-06-20001创建订单2012-06-202012-06-20
2012-06-20001支付完成2012-06-219999-12-31
2012-06-20002创建订单2012-06-209999-12-31
2012-06-20003支付完成2012-06-202012-06-21
2012-06-20003已发货2012-06-229999-12-31
2012-06-21004创建订单2012-06-219999-12-31
2012-06-21005创建订单2012-06-212012-06-21
2012-06-21005支付完成2012-06-229999-12-31
2012-06-22006创建订单2012-06-229999-12-3


说明:

  1. dw_begin_date表示该条记录的生命周期开始时间,dw_end_date表示该条记录的生命周期结束时间;
  2. dw_end_date = ‘9999-12-31’表示该条记录目前处于有效状态;
  3. 如果查询当前所有有效的记录,则select * from order_his where dw_end_date = ‘9999-12-31′
  4. 如果查询2012-06-21的历史快照,则select * from order_his where dw_begin_date <= ‘2012-06-21′ and end_date >= ‘2012-06-21’,这条语句会查询到以下记录:
订单创建日期订单编号订单状态dw_begin_datedw_end_date
2012-06-20001支付完成2012-06-219999-12-31
2012-06-20002创建订单2012-06-209999-12-31
2012-06-20003支付完成2012-06-202012-06-21
2012-06-21004创建订单2012-06-219999-12-31
2012-06-21005创建订单2012-06-212012-06-21

缺点:不支持按时间进行分组,分别统计每个时间点的存量数据总和

 

转载于:https://www.cnblogs.com/coding400/p/10865092.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值