首页 > 解决方案 > 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 列完成的。

标签: sqlhivehiveql

解决方案


您可以使用累积总和来定义组。然后使用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,但这不应该有所作为。


推荐阅读