【问题标题】:aggregation in postgrespostgres 中的聚合
【发布时间】:2013-03-02 07:58:39
【问题描述】:

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

【问题讨论】:

  • 一些示例输入/输出可以澄清问题
  • @Andomar 我已经编辑了我的问题,例如输入和输出。感谢回复
  • 请定义“集群”。该术语可能意味着许多事情。另外:您的任何列都可以是 NULL 还是空 ('')?

标签: sql postgresql postgresql-9.1 postgresql-9.2


【解决方案1】:

如果你想从三个表中获取所有的值,但不知道每个表的每个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 命令,它的问题是它会将结果保存在数据库服务器上,并且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(这也有更好的性能)。

【讨论】:

  • 在问题中,表格似乎具有不同的列类型(例如“”与“ earth>”。)如果是这样,你如果不强制使用相同的类型,就不能使用联合。
  • @Andomar,她对列数据类型只字未提......所以无法确定(应该问她)。但如果是问题所在,我们可以将它们转换为相同的数据类型(如文本),这样可以保存到文件中。
【解决方案2】:

你可以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 命令可以做到这一点。您可能必须将查询结果存储在表中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-25
    • 2021-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多