sql - 根据关联创建分组
问题描述
假设我有一张名为“活动”的表格
activity_id
-----------
1
2
3
4
5
6
7
和一个名为“序列”的表
activity_id associated_activity_id
----------- ----------------------
1 2
1 3
2 4
5 6
6 7
我想写一个选择查询来输出这个:
group_number activity_id
------------ -----------
1 1
1 2
1 3
1 4
2 5
2 6
2 7
活动 1-4 都在组 1 中,因为它们都以某种方式相关(即活动 4 属于组 1,因为它与活动 2 相关,而活动 2 与活动 1 相关)。活动 5 - 7 属于第 2 组,因为它们都是相关的,但它们都与 1 - 4 无关(即它们形成了一个新组)。
解决方案
为此,您可以使用递归 CTE:
with recursive cte as (
select row_number() over (order by activity_id) as group_id, activity_id
from activity a
where not exists (select 1 from sequences s where s.associated_activity_id = a.activity_id)
union all
select cte.group_id, s.associated_activity_id
from cte join
sequences s
on s.activity_id = cte.activity_id
)
select *
from cte
order by group_id, activity_id;
这是一个 db<>fiddle。
推荐阅读
- r - R Str_remove 从管道内的多个列
- amazon-web-services - 如何在 Kinesis Analytics SQL 查询中解析 Json
- ios - 如何在 SwiftUI 中查找滚动视图内容是否已到达内容的末尾
- elm - 包含可能 Time.Posix 的对象的排序列表
- matlab - 优化相邻点的总和 3D
- amazon-web-services - 在发送到 ALB 之前在 AWS Lambda 中处理 URL
- powershell - 为什么这个脚本不会连续运行多次?
- node.js - 同步 NodeJS 批处理作业
- mysql - 有没有办法根据 Hive/SQL 中的条件初始化计数器?
- android - 将 SearchView 添加到片段中的自定义工具栏