SQL统计字段值的累加和

假设hive表 data.table 字段结构如下:

CREATE TABLE IF NOT EXISTS `$target.table`
(
  id string COMMENT '用户ID',
  pv_cnt bigint COMMENT '浏览次数'
) COMMENT ''
PARTITIONED BY (dt string COMMENT '日期') 
STORED AS ORC;

现在需要统计的变量如下:

  1. date_sum:2019-11-03~2019-11-10 每天的总浏览次数;
  2. cumulative_sum:从 2019-11-03 开始每天累加的总浏览次数。

正确的统计sql语句如下:

select dt,
       sum(pv_cnt) as date_sum,
       sum(sum(pv_cnt)) OVER (ORDER BY dt ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS cumulative_sum
  from data.table
 where dt between '20191103' and '20191110'
 group by dt

查询结构如下,可以看到在date_sum统计的每天总浏览量的基础上(哈哈,巧了,每天都一样),cumulative_sum统计出了每天自 2019-11-03开始累加的总浏览量,例如 2019-11-07 对应的cumulative_sum数值就是 2019-11-03~2019-11-07这一功共5天的浏览量数据总和。
在这里插入图片描述

如何理解上面的统计累加量的sql代码呢?

sum(sum(pv_cnt)) OVER (ORDER BY dt ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS cumulative_sum

首先累加的对象是每天的总浏览量,也就是sum(pv_cnt),然后再累加每天的总浏览量的和,所以是sum(sum(pv_cnt))

但是需要现在限定从那天累加到哪天,这个即是 ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW 的作用:

  • UNBOUNDED PRECEDING 表示之前最开始的日期(我们已经使用order by对dt进行从小到大排序了);
  • CURRENT表示到当前的日期,也就是截止累加到哪天就是哪天对应的日期。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值