Sql 配置单元-获取具有上一列值条件的累积和

Sql 配置单元-获取具有上一列值条件的累积和,sql,hive,hiveql,Sql,Hive,Hiveql,输入表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()函数等,但在这种情况下似乎没有任何效果。我基本上是在尝试复制SAS在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()函数等,但在这种情况下似乎没有任何效果。我基本上是在尝试复制SAS在HIVE中的保留功能。非常感谢您的帮助


注意:使用id列进行排序。

您可以使用累积和定义组。然后使用
行编号()
。以下代码中的
用于指定顺序的列:

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;

他是一把小提琴。请注意,这将使用Postgres而不是Hive,但这不会产生任何影响。

您可以使用累积和定义组。然后使用
行编号()
。以下代码中的
用于指定顺序的列:

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;

他是一把小提琴。请注意,这使用Postgres而不是Hive,但这不会产生任何影响。

您应该创建一个变量,并检查fg和x是否都是进位的,然后增加变量值,否则将其指定为0

SELECT id, fg, x, if(fg='Carry' and x = 'Carry', @a:=@a+1, @a:=0) as z from t1, (SELECT @a:= 0) as a;

您应该创建一个变量,检查fg和x是否都是进位,然后增加变量值,否则将其指定为0

SELECT id, fg, x, if(fg='Carry' and x = 'Carry', @a:=@a+1, @a:=0) as z from t1, (SELECT @a:= 0) as a;

SQL表表示无序集。仅使用列提供排序,不清楚哪个列指定数据中的排序。它是用于按升序排序的id列。
id
列不是排序列,因为它有重复的值。它不指定行的顺序。SQL表表示无序集。仅使用列提供排序,不清楚哪个列指定数据中的排序。它是用于按升序排序的id列。
id
列不是排序列,因为它有重复的值。它没有指定行的顺序。谢谢Gordon。根据这段代码,前三行的值是正确的,但第四行的值是4,因为我们使用的是行数函数,但实际上它应该是1,因为我们需要将前一行的计算值z(0)增加1。@Nitish。我做了一个小的修改,包括了一个dbfiddle,显示了代码的工作原理。谢谢Gordon。根据这段代码,前三行的值是正确的,但第四行的值是4,因为我们使用的是行数函数,但实际上它应该是1,因为我们需要将前一行的计算值z(0)增加1。@Nitish。我做了一个小的修正,包括一个DBFIDLE,显示代码工作。@Nitish请检查此项。这将在Mysql上为您提供正确的结果。@Nitish请检查此项。这将在Mysql上为您提供正确的结果。