sql - Hive - 使用前一列值条件获取累积总和
问题描述
输入表 t1:
需要输出:
详细说明:如果 fg 和 x 的值为“进位”,则 z 的值应等于前一行的 z 计算值 + 1。否则 z 应等于 0。根据示例,对于第一行,我们是考虑先前计算的 z 值为 0,然后将其增加 1,因为 fg 和 x 都等于“进位”。
在第二行中,fg 和 x 都是“进位”,前一行的计算值为 1,而不是将其增加 1 得到 2。
在第三行,由于 fg 和 x 都不等于“进位”,所以 z 值为 0。
我尝试过使用 SUM()、LAST_VALUE() 函数等,但在这种情况下似乎没有任何效果。我基本上是在尝试在 HIVE 中复制 SAS 的保留功能。任何帮助是极大的赞赏。
注意:订购是使用 id 列完成的。
解决方案
您可以使用累积总和来定义组。然后使用row_number()
. 以下代码?
用于指定排序的列:
select t.*,
(case when fg = 'Carry' and x = 'Carry'
then row_number() over (partition by id, grp, fg, x order by ?)
else 0
end) as z
from (select t.*,
sum(case when fg = 'Carry' and x = 'Carry' then 0 else 1 end) over (partition by id order by ?) as grp
from t
) t;
这是一个 db<>fiddle。请注意,这使用 Postgres 而不是 Hive,但这不应该有所作为。
推荐阅读
- c - 在 C 中初始化结构的建议方法
- node.js - Heroku - '@heroku/buildpack-registry 无法从 @heroku-cli/plugin-buildpacks 访问'
- java - (Android) 使用地图标记创建边界框并在 Google Map V2 中获取其宽度
- algorithm - 访问二进制矩阵中所有 1 的最短路径(允许访问 0 时)
- python - WebScraping Requests Status 给了我 200 没有内容
- matlab - 关于 MATLAB 解释器工作原理的见解
- reactjs - 除非刷新页面,否则带有 React-Table 的 UseEffect 不会显示更改
- javascript - 在函数参数中使用字符串获取 JSON 对象
- c++ - 在 Qt 中保存/加载应用程序数据?
- python - 为什么'key'是sort_values()的意外关键字