首页 > 解决方案 > 在redshift中使用窗口函数有条件地聚合

问题描述

我有一个包含以下数据的表: 输入数据

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

我想listagg根据 seq 列指定的顺序聚合 gid 中每个组的 items 列(使用 ),基于当 pid0再次成为组时聚合结束的条件。

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

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

标签: sqlgroup-byamazon-redshiftwindow-functionsgaps-and-islands

解决方案


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

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

推荐阅读