簡體   English   中英

postgres中的聚合

[英]aggregation in postgres

我在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對每個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命令,它有問題,它會保存在數據庫服務器上的結果,用戶postgres的SO應該有權期望的路徑上書寫(或者你可以換用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 (它也有更好的性能)。

你可以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命令可以做到這一點。 您可能必須將查詢結果存儲在表中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM