首页 > 解决方案 > 在 SQL 中计算“运行中的位置”

问题描述

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

输入表:

id value
-- -----
 1   1
 2   1
 3   2
 4   3
 5   1
 6   1
 7   1 

沿着表格向下,即按 id 递增的顺序,我想计算连续多少次连续看到相同的值,即运行中的位置:

输出表:

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

有任何想法吗?我已经搜索了包括超前和滞后在内的窗口函数的组合,但无法想出它。请注意,相同的值可以作为不同运行的一部分出现在值列中,因此按值分区可能无助于解决此问题。我在 Hive 1.2 上。

标签: hivehiveql

解决方案


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

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

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

最终查询row_number用于获取分配有上述查询的每个组中的位置。

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

推荐阅读