使用Hive中的值计算连续的日期范围

时间:2018-04-18 20:47:05

标签: hive hiveql calculated-columns windowing hive-query

我想知道是否可以计算一组Id的特定值的连续范围,并返回每个Id的计算值。 鉴于以下数据:

{{1}}

我想要以下输出:

{{1}}

在这种情况下,范围是信用证小于1的连续天数。如果date_key列之间存在差距,则范围将不必采用下一个值,例如在8096和8098之间的ID 1中键。 是否可以在Hive中使用窗口函数执行此操作?

提前致谢!

2 个答案:

答案 0 :(得分:0)

您可以使用将行分类为组的运行总和来执行此操作,每次找到信用< 1行时(以date_key顺序)递增1。此后它只是group by

select id,count(*) as range_days_credit_lt_1
from (select t.*
      ,sum(case when credit<1 then 0 else 1 end) over(partition by id order by date_key) as grp
      from tbl t
     ) t
where credit<1
group by id

答案 1 :(得分:0)

关键是折叠所有连续序列并计算其长度,我努力以相对笨拙的方式实现这一点:

with t_test as 
(
select num,row_number()over(order by num) as rn
from
(
select explode(array(1,3,4,5,6,9,10,15)) as num
)
)
select length(sign)+1 from
(
select explode(continue_sign) as sign
from 
(
select split(concat_ws('',collect_list(if(d>1,'v',d))), 'v') as continue_sign
from 
(
select t0.num-t1.num as d from t_test t0 
join t_test t1 on t0.rn=t1.rn+1
)
)
)
  1. 获取每个原始a的序列中的前一个数字b;
  2. 检查a-b == 1,是否显示标记为“ v”的“间隙”;
  3. 将所有a-b合并为一个字符串,然后使用'v'分割并计算长度。

要删除ID列,应考虑另一个编码id的字符串。