sql - SQL 计算基于 Hive 列中先前值重置的累积总和
问题描述
我正在尝试用这样的东西创建一个累积值
KEY1 Date_ VAL1 CUMU_VAL2
K1 D1 1 0
K1 D2 1 1
K1 D3 0 2
K1 D4 1 0
K1 D5 1 1
因此,问题基本上是在 VAL1 中的前一行的基础上继续在 CUMU_VAL2 列中将值加 1,但是当 VAL1 列中的前一个值为零时,此总和会重置。基本上,如果你在 excel 中这样做,那么 Cell(D3) 的公式是
D3 = IF(C2>0, D2+1, 0)
我相信我应该能够做到这样,但是当先前的值为零时如何添加案例然后重置总和?
SELECT
a1.*,
SUM(a1.VAL1) OVER (PARTITION BY a1.KEY1 ORDER BY a1.Date_ ) AS CUMU_VAL2
FROM source_table a1
解决方案
您可以分配一个组 - 这是给定行之后的 0 的总和。然后使用count()
:
select t.KEY1, t.Date_, t.VAL1,
count(*) over (partition by key1, grp, (case when val1 = 0 then 0 else 1 end)
order by date_
) as cume_val1
from (select t.*,
sum(case when a.val1 = 0 then 1 else 0 end) over (partition by key1 order by date_ rows between 1 following and unbounded following) as grp
from source_table t
) t;
如果val1
只取值 0 和 1,则使用row_number()
而不是count()
.
推荐阅读
- sql - Rails:如何使用递归(Postgresql)查询父类别的所有子类别,然后查询其子类别等
- python - 默认参数:计算在用餐者之间拆分支票
- javascript - 如何检测碰撞?
- typescript - 元素 UI 包括所有组件。制作大包大小
- php - 在php中将表格数据渲染为pdf
- python - Numpy python数组切片
- php - 如何通过 PHP 中的回显获取要在 HTML 中输出的变量
- java - 在主要活动上按后退按钮打开其他活动
- android - 最近更新后,pug get 无法正常工作。有任何想法吗?
- php - 仅在前端将搜索结果限制为 WooCommerce 产品