在redshift中使用窗口函数有条件地进行汇总

问题描述 投票:1回答:1

我有一个包含以下数据的表:input data

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

我要根据seq列所指定的顺序,对gid中每个组的item列(使用listagg进行聚合,这是基于当pid再次变为组的0时聚合结束的条件。

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

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

sql group-by amazon-redshift gaps-and-islands
1个回答
0
投票

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

这是使用窗口总和定义组的一种解决方法:基本上,每当满足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
© www.soinside.com 2019 - 2024. All rights reserved.