使用配置单元中的值计算日期的连续范围

vaj7vani  于 2021-06-26  发布在  Hive
关注(0)|答案(2)|浏览(446)

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

+----+----------+--------+
| ID | DATE_KEY | CREDIT |
+----+----------+--------+
|  1 |     8091 |    0.9 |
|  1 |     8092 |     20 |
|  1 |     8095 |   0.22 |
|  1 |     8096 |   0.23 |
|  1 |     8098 |   0.23 |
|  2 |     8095 |     12 |
|  2 |     8096 |     18 |
|  2 |     8097 |      3 |
|  2 |     8098 |   0.25 |
+----+----------+--------+

我想要以下输出:

+----+-------------------------------+
| ID | RANGE_DAYS_CREDIT_LESS_THAN_1 |
+----+-------------------------------+
|  1 |                             1 |
|  1 |                             2 |
|  1 |                             1 |
|  2 |                             1 |
+----+-------------------------------+

在这种情况下,范围是信用小于1的连续天数。如果date和key列之间有间隔,那么范围就不必取下一个值,就像在id 1中8096和8098之间的date key一样。是否可以在配置单元中使用窗口功能来执行此操作?
提前谢谢!

qnzebej0

qnzebej01#

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

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
)
)
)

对于每个原始a,获取序列中的前一个数字b;
检查a-b==1,显示是否有“间隙”,标记为“v”;
将所有a-b合并为一个字符串,然后使用“v”拆分,并计算长度。
为了得到id列,应该考虑另一个编码id的字符串。

de90aj5v

de90aj5v2#

您可以通过运行sum将行分为多个组来实现这一点,每次找到<1行的信用卡时(按日期键顺序)递增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

相关问题