1

我在 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中这样做是否可行。如果是..那怎么办?

4

2 回答 2

3

如果您想从三个表中获取所有值,但不知道每个 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连接结果并几乎读取到您的文件:

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命令,它的问题是它将结果保存在数据库服务器上,并且postgresSO 的用户应该有权在所需的路径上写入(或者您可以使用 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改用(这也具有更好的性能)。

于 2013-03-02T10:44:02.097 回答
0

你可以join把桌子放在一起:

select  coalesce(t1.id,t2.id,t3.id) as id
,       t1.col1
,       t1.col2
,       t2.col3
,       t3.col4
from    Table1 t1
full outer join
        Table2 t2
on      t1.id = t2.id
full outer join
        Table3 t3
on      t3.id = coalesce(t1.id, t2.id)

至于写入文件,看起来 Postgres 的COPY命令可以做到这一点。您可能必须将查询结果存储在表中。

于 2013-03-02T08:30:19.113 回答