sql - postgres中的聚合

标签 sql postgresql postgresql-9.1 postgresql-9.2

我在 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/

相关文章:

postgresql-9.1 - 尝试恢复数据库时 PgAdmin III 没有响应

postgresql - 连接到 amazon ec2 上的远程 postgresql 服务器

postgresql - Postgres在linux中查找配置文件

mysql - 使用 JOIN 代替子查询

mysql子查询与内连接?

mysql - EXISTS 中的递归 CTE 查询

postgresql - 用于 Postgresql 9.6 的 pgpool HA + repmgr

sql - 按 Postgresql 分组

php - CodeIgniter 多表选择不起作用

arrays - Postgresql:具有逗号分隔值的行列中的编辑距离