hive求连续段的最后一个数及每段的个数


需求

有一个表存放在数字ID,要求输出连续段的最后一个id及每段的个数;

数据准备

create table temp_id_list_0209
(
    id int
) row format delimited
    fields terminated by '\t'
    stored as orc
    tblproperties ("orc.compress" = "snappy");

insert into temp_id_list_0209
values (1),
       (2),
       (4),
       (5),
       (6),
       (9),
       (10),
       (11),
       (12)
;
select * from temp_id_list_0209;

实现思路

第一步

select id,
       lag(id, 1, id) over (order by id)      df,
       id - lag(id, 1, id) over (order by id) diff
from temp_id_list_0209;
id df diff
1 1 0
2 1 1
4 2 2
5 4 1
6 5 1
9 6 3
10 9 1
11 10 1
12 11 1

第二步

select id, sum(case when diff > 1 then 1 else 0 end) over (order by id) as grep
from (select id,
             id - lag(id, 1, id) over (order by id) as diff
      from temp_id_list_0209) i;
id grep
1 0
2 0
4 1
5 1
6 1
9 2
10 2
11 2
12 2

第三步

select grp, max(id) last_id, count(id) cnt
from (select id, sum(if(diff > 1, 1, 0)) over (order by id) as grp
      from (select id, id - lag(id, 1, id) over (order by id) as diff
            from temp_id_list_0209) m) n
group by grp;
gre last_id cnt
1 6 3
2 12 4
0 2 2