我在PostgreSQL中有一个表,其中有两列:id
和nodes
。 id
的类型为bigint
,因为它是表中的主键。 nodes
是bigint
的数组。我想创建一个新表,其中node
数组中的节点是键,唯一的另一列是与该ids
对应的node
数组。
因此,假设原始表格是这样的:
id | nodes
1 | {200, 300, 400}
2 | {200, 300, 400}
然后新表应类似于:
node | ids
200 | {1, 2}
300 | {1, 2}
400 | {1, 2}
答案 0 :(得分:1)
if not isinstance(sequence, (list, tuple)):
sequence = [sequence]
for value in sequence:
...
SELECT node, array_agg(id) as ids
FROM (
SELECT id, unnest(nodes) as node
FROM nodes
)s
GROUP BY node
ORDER BY node
将数组扩展为每个元素一行。
然后,您可以按数组元素unnest()
并将GROUP
与ids
进行聚合
对于您来说,这可以简化为没有任何子查询或联接的查询:
array_agg
答案 1 :(得分:0)
您可以取消嵌套并重新聚合。无需子查询:
with t as (
select 1 as id, array[200, 300, 400] as nodes union all
select 2 as id, array[200, 300, 400] as nodes
)
select node, array_agg(t.id)
from t cross join
unnest(nodes) node
group by node