问题描述
我有这样的数据,并且没有要分组的id列,例如:
A
B
C
NULL
F
D
R
NULL
R
T
G
预期输出:
ABC
FDR
RTG
解决方法
这是一个孤岛问题。一种选择是使用累积总和来定义组,然后进行聚合-但是我需要用一列来定义行的顺序,我假设id
。
select string_agg(val,'') within group (order by id) vals
from (
select
val,sum(case when val is null then 1 else 0 end) over(order by id) grp
from mytable
) t
group by grp
order by grp
如果可能有连续的null
,则在外部查询中需要一个where
子句:
select string_agg(val,sum(case when val is null then 1 else 0 end) over(order by id) grp
from mytable
) t
where val is not null
group by grp
order by grp
您还可以使用窗口计数来构建组:
select string_agg(val,count(*) over(order by id) cnt1,count(val) over(order by id) cnt2
from mytable
) t
group by cnt1 - cnt2
order by cnt1 - cnt2