[英]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.