在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
的相邻行组合在一起,直到满足具有值 0
的 pid
。
这是使用 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
我有一个 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
的相邻行组合在一起,直到满足具有值 0
的 pid
。
这是使用 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