sql - 在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。
解决方案
我将您的问题理解为差距和孤岛问题,您希望将具有相同的相邻行组合在一起,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
推荐阅读
- ssh - 在 Hashicorp Boundary 中使用即时 ssh 密钥对用户进行身份验证
- flutter - 如何将动态参数传递给 Flutter Web 应用程序
- autodesk-forge - 提取 IFC/RVT 文件信息
- python - Python匹配相似的字符串并将它们从两个列表中组合在一起
- caching - 在 clickhouse 中设置缓存字典时出现 OOM 错误
- c - fscanf 在文件中遇到新行时停止
- jquery - 我想附加 AuthorsInfo 的每个名称的排名值可以这样做吗?
- microsoft-graph-api - “邮件”字段在 Graph API 中没有唯一值
- amazon-web-services - 从 API Gateway 编码查询参数
- javascript - 如果字符串是不可变的,那么 "foo" === "foo" 如何?