我在 postgres 中有 3 个表,其中包含以下形式的信息:
<id, column1, column2, column3>
现在我打算根据id聚合3个表,这样所有具有相同id的行都出现在一起。在具有 3 个表的 postgres 中执行此操作是否可行。我还打算将集群 ID 存储在一个单独的文本文件中。
我知道如何用 1 个表进行聚类..但我不知道如何在 postgres 中用 3 个表进行聚类。另外我不确定我们是否可以将聚合的行放入文件中。我用诸如“postgres 将聚合行放入文本文件”之类的关键字进行搜索,但没有得到合适的结果。
有人可以帮我解决这个问题吗?另外,我是 postgres 的新手,所以请原谅。
例如我的输入是:
#@<id1> <moon> <diamter> <x>
#@<id1> <moon> <closest_to> earth>
现在我想做以下事情:
#@<id1> <moon> <diameter> <x>, <moon> <closest_to> <earth>
那就是我想 GROUPBY id 并将上面的结果分组存储在一个文件中。在 postgres 中这样做是否可行?如果是..那怎么办?
最佳答案
如果您想从三个表中获取所有值,但不知道每个表的每个 ID 有多少行,您可以UNION
它们:
SELECT id, col1, col2, col3
FROM tab1
UNION
SELECT id, col1, col2, col3
FROM tab2
UNION
SELECT id, col1, col2, col3
FROM tab3
有了它,您可以使用 string_agg
来连接结果并使 almost read 转到您的文件:
SELECT id, string_agg(col1 || ' ' || col2 || ' ' || col3, ', ')
FROM (
SELECT id, col1, col2, col3
FROM tab1
UNION
SELECT id, col1, col2, col3
FROM tab2
UNION
SELECT id, col1, col2, col3
FROM tab3
) AS tbls
GROUP BY id;
至少,您可以将结果复制到文件中。基本上有两种方法。第一种是从您的应用程序执行此操作,这很好,因为它很容易发送给用户(有用户吗?)。另一种是使用COPY
命令,有一个问题是会将结果保存在数据库服务器上,SO的用户postgres
应该有权限在所需路径上写入(或者您可以使用 psql 的 \copy
或您的应用程序包装权限)。
副本类似于:
COPY (
SELECT '#@' || id || ' ' || string_agg(col1 || ' ' || col2 || ' ' || col3, ', ')
FROM (
SELECT id, col1, col2, col3
FROM tab1
UNION
SELECT id, col1, col2, col3
FROM tab2
UNION
SELECT id, col1, col2, col3
FROM tab3
) AS tbls
GROUP BY id
) TO '/tmp/yourfile.txt';
OBS:请注意,我使用了 UNION
,这将抑制表之间的重复值。如果你不想要那个或者你没有重复的值(当然)使用 UNION ALL
代替(它也有更好的性能)。
关于sql - postgres中的聚合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15172217/