Hive 计算;“运行中的位置”;在SQL中

Hive 计算;“运行中的位置”;在SQL中,hive,hiveql,Hive,Hiveql,我有一个连续ID(整数,1…n)和值(整数)的表,如下所示: 输入表: id value -- ----- 1 1 2 1 3 2 4 3 5 1 6 1 7 1 id value position in run -- ----- --------------- 1 1 1 2 1 2 3 2 1 4 3 1 5 1 1

我有一个连续ID(整数,1…n)和值(整数)的表,如下所示:

输入表:

id value
-- -----
 1   1
 2   1
 3   2
 4   3
 5   1
 6   1
 7   1 
id value position in run  
-- ----- ---------------  
 1   1          1
 2   1          2
 3   2          1
 4   3          1
 5   1          1
 6   1          2
 7   1          3
沿着表格往下看,即按照增加id的顺序,我想计算一行中连续看到相同值的次数,即运行中的位置:

输出表:

id value
-- -----
 1   1
 2   1
 3   2
 4   3
 5   1
 6   1
 7   1 
id value position in run  
-- ----- ---------------  
 1   1          1
 2   1          2
 3   2          1
 4   3          1
 5   1          1
 6   1          2
 7   1          3

有什么想法吗?我搜索了一组窗口功能,包括超前和滞后,但没有找到。请注意,相同的值可以作为不同运行的一部分出现在值列中,因此按值分区可能无助于解决此问题。我在Hive1.2上。

一种方法是使用行号差异方法将连续的相同值分为一组。然后使用行号函数来获得每组中所需的位置

查询以分配组(运行此查询将帮助您了解如何分配组。)

使用
行号
进行最终查询,以获取分配给上述查询的每个组中的职位

select id,value,row_number() over(partition by value,rnum_diff order by id) as pos_in_grp
from (select t.*
      ,row_number() over(order by id) - row_number() over(partition by value order by id) as rnum_diff
      from tbl t
     ) t

我很确定,使用一个变量来表示之前的值,另一个变量来跟踪它的运行位置是生成这样一个输出的理想解决方案。老实说,在插入/更新/删除模式时,我会修改模式来计算此类内容,以帮助加快选择速度。太棒了!!。。这有点复杂,你已经解决了。嗨@Vamsi。。请您尝试一下@stack0114106。。一直在考虑这个问题..还没有找到解决这个问题的方法:)在SQL中使用递归cte是可能的..但是,Spark SQL和Hive中不支持它。谢谢你的回复..不管你用什么方法解决..很好..完成后请告诉我