id_start id_end
1 2
2 3
3 4

我想收集像[1, 2, 3, 4]这样"连接"的元素.(例如,在数组中)

我try 了递归查询,如下所示:

WITH RECURSIVE q_rec AS (
    SELECT id_start,
           id_end
    FROM my_table
    UNION
    SELECT t.id_start
           t.id_end
    FROM       my_table t
    INNER JOIN q_rec r ON r.id_start = t.id_end
) 
SELECT *
FROM q_rec;

但是,即使它们不在同一列中,我如何将它们聚合到一个数组中呢?

推荐答案

另一种方法将递归查询中的所有ID收集为一个表.然后应用聚合.

WITH RECURSIVE cte AS (
  SELECT id_start AS first_id, 
         id_start AS id
  FROM tab t1
  WHERE NOT EXISTS(SELECT 1 FROM tab t2 WHERE t1.id_start = t2.id_end)

  UNION ALL

  SELECT cte.first_id,
         tab.id_end
  FROM       cte
  INNER JOIN tab
          ON cte.id = tab.id_start
)
SELECT first_id, 
       ARRAY_AGG(id) AS ids
FROM cte
GROUP BY first_id

Output:

first_id ids
1 [1,2,3,4]

查看演示here.

Sql相关问答推荐

使用交叉应用透视表在SQL中转换分段时间段&

如何以"% m—% d"格式对生日列表进行排序,以查找与今天最近的日期?

使用SQL旋转表的列(Snowflake)

从以前的非空值行中获取值

SQL子查询返回多个值错误

你能过滤一个列表只返回多个结果吗?

PostgreSQL 9.6嵌套的INSERT/RETURN语句的CTE性能低得令人无法接受

关于Postgres横向联接的谓词

将结果从一列转换为两行或更多

通过对象分离实现原子性

显示十进制列,但尽可能显示为整数

如何使用jsonn_populate_record()插入到包含IDENTITY列的表中

对于小数据集,EF / SQL 语句花费的时间太长

如何根据 Google BigQuery 中的特定列值连接一列的 N 行?

如何在 SQL 中将两行(或多行)jsonb 数组合并为一行

如何在TSQL中编写此窗口查询

当该日期的至少两条记录具有相同的持续时间或至少一条记录的持续时间为 0 时,如何标记该日期的所有记录

为数组中的每个元素从表中收集最大整数

在 postgresql 中,我可以将其组合成一个查询吗?

在 MindsDB SQL 编辑器中运行 PostgreSQL 条目 ID 时出现未知 Select 目标错误