我有一张有以下数据的表格:

链接到测试数据:http://sqlfiddle.com/#!15/dce01/1/0
我希望按照seq列指定的顺序为gid中的每个组聚合items列(使用listagg),其条件是当pid再次成为组的0时聚合结束。
也就是说,对于g1组,将有两个聚合;一个用于seq1-3,另一个用于序列4-6;因为对于g1组,pid对于seq 4为0。
我期望给定示例的结果如下(请注意,结果中的seq是pid变为0的组的seq的最小值):

发布于 2020-02-17 11:09:39
我将您的问题理解为空白和孤岛问题,您希望将具有相同gid的相邻行组合在一起,直到满足具有值0的pid为止。
下面是一种使用窗口和来定义组的方法:基本上,每次遇到pid值0时,都会启动一个新的岛。其余的只是聚合:
select
gid,
min(seq) seq,
listagg(items, ',') within group(order by seq) items
from (
select
t.*,
sum(case when pid = 0 then 1 else 0 end) over(partition by gid order by seq) grp
from mytable t
) t
group by gid, grp
order by gid, grp发布于 2020-02-17 11:12:47
这是缺口和岛屿问题:
with
subgroup_ids as (
select *, sum(case when pid=0 then 1 else 0 end) over (partition by gid order by seq) as subgroup_id
from tablename
)
select gid, subgroup_id, listagg(items,',')
from subgroup_ids
group by 1,2https://stackoverflow.com/questions/60258980
复制相似问题