链接到测试数据:http://sqlfiddle.com/#!15/dce01/1/0
我要根据seq列所指定的顺序,对gid中每个组的item列(使用listagg
进行聚合,这是基于当pid再次变为组的0
时聚合结束的条件。
即对于组g1,将有2个聚合; 1代表序列1-3,另一个代表序列4-6;因为对于组g1,对于序列4,pid变为0。
我将您的问题理解为间隙和孤岛问题,您希望将具有相同gid
的相邻行组合在一起,直到满足具有pid
的0
的条件。
这是使用窗口总和定义组的一种解决方法:基本上,每当满足0
的pid时,就会启动一个新岛。剩下的只是聚合:
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