This answer显示如何将每个组的几列折叠为一个键:值对array.

friends_map:
=================================
user_id    friend_id    confirmed
=================================
1          2            true
1          3            false
2          1            true
2          3            true
1          4            false
SELECT user_id, array_agg((friend_id, confirmed)) as friends
FROM friend_map
WHERE user_id = 1
GROUP BY user_id

退货

user_id |           friends            
--------+--------------------------------
      1 | {"(2,true)","(3,false)","(4,false)"}

我的问题

如何反其道而行之,从结果表回到初始表?

推荐答案

在PrestoSQL/Trino中,您可以使用unnest:

-- sample data
with dataset(user_id, friend_id, confirmed) as(
    values (1, 2, true),
    (1, 3, false),
    (2, 1, true),
    (2, 3, true),
    (1, 4, false)
),
friend_map as (
    SELECT user_id, array_agg((friend_id, confirmed)) as friends
    FROM dataset
    GROUP BY user_id
)

-- query
select user_id, friend_id, confirmed
from friend_map,
unnest(friends) as t(friend_id, confirmed);

UPD

目前雅典娜(我自己无法访问雅典娜自动取款机进行测试)似乎不支持行到列的自动解嵌,因此您可以try :

select user_id, r.friend_id, r.confirmed 
from (
    select user_id, cast(r as row(friend_id INT, confirmed VARCHAR))) r
    from friend_map,
    unnest(friends) as t(r)
);

select user_id, r[1] friend_id, r[2] confirmed
from friend_map,
unnest(friends) as t(r)

附注:

Note that Athena is not based on PostgreSQL, it is based on Presto/Trino (dependent on the engine version)

Postgresql相关问答推荐

PostgreSQL:如何 for each 唯一的客户输入/更新列中的数据,并将其递增1直到表的末尾

读取扩展坞合成中的UDP:IO/超时

无法在timscaleDb中创建Hypertable

使用pg_repack从PostgreSQL中的表中删除OID

将具有自定义类型的表从一种模式复制到另一种模式

无法使用golang在postgresql中使用自定义类型插入/更新数据

我应该 Select 哪种数据类型?

MERGE 语句的锁定级别

有没有办法使用postgresql将具有不同ID的同一行多次添加到表中?

如何在 Postgres 中的列上删除唯一约束?

带有初始数据的 docker postgres 不会在提交中持久化

如何让 Rails 使用 SSL 连接到 PostgreSQL?

mysql_insert_id 替代 postgresql

如何使用字符串作为 PostgreSQL 咨询锁的键?

无法安装 psycopg2 Ubuntu

如何使用 node-postgres 将多行正确插入 PG?

如何使用 PostgreSQL 触发器来存储更改(SQL 语句和行更改)

如何在 psql 中设置默认显示模式

错误:索引表达式中的函数必须在 Postgres 中标记为 IMMUTABLE

pg_restore 目录错误