在redshift中使用window函数进行条件聚合

Using window function in redshift to aggregate conditionally

我有一个 table,其中包含以下数据:

Link 测试数据:http://sqlfiddle.com/#!15/dce01/1/0

我想按照 seq 列指定的顺序为 gid 中的每个组聚合项目列(使用 listagg),基于当 pid 再次变为 0 时聚合结束的条件组.

即 对于组 g1,将有 2 个聚合; 1 个用于序列 1-3,另一个用于序列 4-6;因为对于组 g1,seq 4 的 pid 变为 0。

我希望给定示例的结果如下(请注意,结果中的 seq 是 pid 变为 0[=28 的组的 seq 的最小值=]):

我将您的问题理解为间隙和孤岛问题,您希望将具有相同 gid 的相邻行组合在一起,直到满足具有值 0pid

这是使用 window 总和来定义组的一种解决方法:基本上,每次遇到 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

是缺口和孤岛问题:

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,2