2013-03-27 262 views
3

比方說,我有一個簡單的表agg_test 3列 - id,column_1column_2。數據集,例如:聚合聚合(ARRAY_AGG)?

id|column_1|column_2 
-------------------- 
1|  1|  1 
2|  1|  2 
3|  1|  3 
4|  1|  4 
5|  2|  1 
6|  3|  2 
7|  4|  3 
8|  4|  4 
9|  5|  3 
10|  5|  4 

這樣的查詢(帶自加入):

SELECT 
    a1.column_1, 
    a2.column_1, 
    ARRAY_AGG(DISTINCT a1.column_2 ORDER BY a1.column_2) 
FROM agg_test a1 
JOIN agg_test a2 ON a1.column_2 = a2.column_2 AND a1.column_1 <> a2.column_1 
WHERE a1.column_1 = 1 
GROUP BY a1.column_1, a2.column_1 

會產生這樣的結果:

column_1|column_1|array_agg 
--------------------------- 
     1|  2|  {1} 
     1|  3|  {2} 
     1|  4| {3,4} 
     1|  5| {3,4} 

我們可以看到,值4在連接表中有5個,我們在最後一列有相同的結果。因此,是否有可能以某種方式組的結果通過它,e.g:

column_1|column_1|array_agg 
--------------------------- 
     1|  {2}|  {1} 
     1|  {3}|  {2} 
     1| {4,5}| {3,4} 

感謝您的任何答案。如果有什麼不清楚或者能夠以更好的方式呈現 - 請在評論中告訴我,我會盡量讓這個問題儘可能可讀。

回答

4

我不確定您是否可以通過數組進行聚合。如果你能在這裏是一種方法:

select col1, array_agg(col2), ar 
from (SELECT a1.column_1 as col1, a2.column_1 as col2, 
      ARRAY_AGG(DISTINCT a1.column_2 ORDER BY a1.column_2) as ar 
     FROM agg_test a1 JOIN 
      agg_test a2 
      ON a1.column_2 = a2.column_2 AND a1.column_1 <> a2.column_1 
     WHERE a1.column_1 = 1 
     GROUP BY a1.column_1, a2.column_1 
    ) t 
group by col1, ar 

另一種方法是使用array_dims到數組值轉換爲字符串。

+0

謝謝,對我完美的作品。 – Przemek 2013-03-27 15:41:00

2

您也可以嘗試這樣的事:

SELECT DISTINCT 
    a1.column_1, 
    ARRAY_AGG(a2.column_1) OVER ( PARTITION BY a1.column_1, ARRAY_AGG(DISTINCT a1.column_2 ORDER BY a1.column_2) ) AS "a2.column_1 agg", 
    ARRAY_AGG(DISTINCT a1.column_2 ORDER BY a1.column_2) 
FROM agg_test a1 
JOIN agg_test a2 ON a1.column_2 = a2.column_2 AND a1.column_1 a2.column_1 
WHERE a1.column_1 = 1 
GROUP BY a1.column_1, a2.column_1 
;

(突出顯示的是從你張貼在你的問題中查詢不同的部分)

以上使用窗口ARRAY_AGG到將a2.column_1的值與其他其他ARRAY_AGG相結合,將後者的結果作爲分區標準之一。如果沒有DISTINCT,它會爲您的示例生成兩行{4,5}行。因此,需要DISTINCT來消除重複項。

這裏有一個SQL小提琴演示:http://sqlfiddle.com/#!1/df5c3/4

但是請注意,該窗口ARRAY_AGG不能有ORDER BY就像是「正常」的對口。這意味着列表中的a2.column_1值的順序將是不確定的,儘管在鏈接的演示中它確實與您預期的輸出中的值相匹配。