需求
元数据如:,需要整合成为
如果需将多行合并成一行,按A列排序后,再将B列合并连续值可以使用这个办法。
比如 我们测试了一些路线点,针对这些路线点的数据,可以筛选出某人的超速路段,如上图B列为1的可以理解为在这个点,某车超速了。
而我们需要筛选出这辆车具体在哪些地方超速了。答案就是有三个路段。
思路就是:
rank => row_number() over(order by a) 整个时间段的排序。
grouprank => sub(b) over(order by a) 当前点是第几个点。
rank - grouprank = groupid
groupid 就是我们的分组Id。
因为如果是连续之前rank = a;grouprank =b ;
当连续的时候 rank 和grouprank 是同时+1。
当不连续的时候 rank +1 ; grouprank不变 正好给我们groupid +1(rank- grouprank)
代码:
将A行排序,使用if(lag(C,1,C) over(order by A)=C,1,0) as b, B as a得到上图表,
然后使用可以将其合并。
可以简化sql,但这里只提供一个思路。
select
collect_set(a) as answer
from
(
select
*, rank - sum(b) over(order by a) as groupid
from
(select *,row_number() over(order by a) as rank from TableName order by a)
order by
a
)
where
b = 1
group by
groupid
;
Table表中只有转换后的 a,b两列。