创建 CSV 文件时,Postgres id 到数组中的名称映射
Postgres id to name mapping in an array while creating CSV file
我有一个 table 具有 id 到组名称映射。
1. GroupA
2. GroupB
3. GroupC
.
.
.
15 GroupO
并且我有用户 table,用户 ID 到组 ID 映射,组 ID 在用户 table
中定义为数组
User1 {1,5,7}
User2 {2,5,9}
User3 {3,5,11,15}
.
.
.
我想以这种方式合并到 table 以检索 CSV 文件中的用户 ID 和组名映射。
例如:User1 {GroupA, GroupE, GroupG}
基本上组 ID 应该在创建 CSV 文件时被组名替换。
假设您有两个这种形式的表:
Table groups
Column | Type
-----------+---------
groupname | text
groupid | integer
Table users
Column | Type
----------+----------
username | text
groupids | integer[] <-- group ids as inserted in table groups
您可以使用此代码查询将组ID替换为组名的用户:
WITH users_subquery AS (select username,unnest (groupids) AS groupid FROM users)
SELECT username,array_agg(groupname) AS groups
FROM users_subquery JOIN groups ON users_subquery.groupid = groups.groupid
GROUP BY username
如果您需要组作为字符串(对 csv 导出有用),请用 array_to_string 语句包围查询:
SELECT username, array_to_string(groups,',') FROM
(
WITH users_subquery AS (select username,unnest (groupids) AS groupid FROM users)
SELECT username,array_agg(groupname) AS groups
FROM users_subquery JOIN groups ON users_subquery.groupid = groups.groupid
GROUP BY username
) as foo;
结果:
username | groups
----------+-----------------
user1 | group1,group2
user2 | group2,group3
设置:
create table mapping(id int, group_name text);
insert into mapping
select i, format('Group%s', chr(i+ 64))
from generate_series(1, 15) i;
create table users (user_name text, user_ids int[]);
insert into users values
('User1', '{1,5,7}'),
('User2', '{2,5,9}'),
('User3', '{3,5,11,15}');
循序渐进(理解查询,见SqlFiddle):
使用 unnest() 列出所有单个 user_id 一行:
select user_name, unnest(user_ids) user_id
from users
通过加入映射将 user_id 替换为 group_name:
select user_name, group_name
from (
select user_name, unnest(user_ids) id
from users
) u
join mapping m on m.id = u.id
将 group_name 聚合到 user_name 的数组中:
select user_name, array_agg(group_name)
from (
select user_name, group_name
from (
select user_name, unnest(user_ids) id
from users
) u
join mapping m on m.id = u.id
) m
group by 1
在复制命令中使用最后一个查询:
copy (
select user_name, array_agg(group_name)
from (
select user_name, group_name
from (
select user_name, unnest(user_ids) id
from users
) u
join mapping m on m.id = u.id
) m
group by 1
)
to 'c:/data/example.txt' (format csv)
我有一个 table 具有 id 到组名称映射。
1. GroupA
2. GroupB
3. GroupC
.
.
.
15 GroupO
并且我有用户 table,用户 ID 到组 ID 映射,组 ID 在用户 table
中定义为数组User1 {1,5,7}
User2 {2,5,9}
User3 {3,5,11,15}
.
.
.
我想以这种方式合并到 table 以检索 CSV 文件中的用户 ID 和组名映射。
例如:User1 {GroupA, GroupE, GroupG}
基本上组 ID 应该在创建 CSV 文件时被组名替换。
假设您有两个这种形式的表:
Table groups
Column | Type
-----------+---------
groupname | text
groupid | integer
Table users
Column | Type
----------+----------
username | text
groupids | integer[] <-- group ids as inserted in table groups
您可以使用此代码查询将组ID替换为组名的用户:
WITH users_subquery AS (select username,unnest (groupids) AS groupid FROM users)
SELECT username,array_agg(groupname) AS groups
FROM users_subquery JOIN groups ON users_subquery.groupid = groups.groupid
GROUP BY username
如果您需要组作为字符串(对 csv 导出有用),请用 array_to_string 语句包围查询:
SELECT username, array_to_string(groups,',') FROM
(
WITH users_subquery AS (select username,unnest (groupids) AS groupid FROM users)
SELECT username,array_agg(groupname) AS groups
FROM users_subquery JOIN groups ON users_subquery.groupid = groups.groupid
GROUP BY username
) as foo;
结果:
username | groups
----------+-----------------
user1 | group1,group2
user2 | group2,group3
设置:
create table mapping(id int, group_name text);
insert into mapping
select i, format('Group%s', chr(i+ 64))
from generate_series(1, 15) i;
create table users (user_name text, user_ids int[]);
insert into users values
('User1', '{1,5,7}'),
('User2', '{2,5,9}'),
('User3', '{3,5,11,15}');
循序渐进(理解查询,见SqlFiddle):
使用 unnest() 列出所有单个 user_id 一行:
select user_name, unnest(user_ids) user_id
from users
通过加入映射将 user_id 替换为 group_name:
select user_name, group_name
from (
select user_name, unnest(user_ids) id
from users
) u
join mapping m on m.id = u.id
将 group_name 聚合到 user_name 的数组中:
select user_name, array_agg(group_name)
from (
select user_name, group_name
from (
select user_name, unnest(user_ids) id
from users
) u
join mapping m on m.id = u.id
) m
group by 1
在复制命令中使用最后一个查询:
copy (
select user_name, array_agg(group_name)
from (
select user_name, group_name
from (
select user_name, unnest(user_ids) id
from users
) u
join mapping m on m.id = u.id
) m
group by 1
)
to 'c:/data/example.txt' (format csv)