2016-09-23 419 views
4

在Vertica的一個表:測試是這樣的:聚合函數的字符串連接在Vertica的

ID  | name 
1  | AA 
2  | AB 
2  | AC 
3  | AD 
3  | AE 
3  | AF 

我如何使用聚合函數或如何編寫一個查詢來獲取這樣的(Vertica的語法)的數據?

ID | ag 
1  | AA 
2  | AB, AC 
3  | AD, AE, AF 

回答

0

首先,您需要編譯udx爲agg_concatenate

-- Shell commands 
cd /opt/vertica/sdk/examples/AggregateFunctions/ 
g++ -D HAVE_LONG_INT_64 -I /opt/vertica/sdk/include -Wall -shared -Wno-unused-value -fPIC -o Concatenate.so Concatenate.cpp /opt/vertica/sdk/include/Vertica.cpp 

-- vsql commands 
CREATE LIBRARY AggregateFunctionsConcatenate AS '/opt/vertica/sdk/examples/AggregateFunctions/Concatenate.so'; 
CREATE AGGREGATE FUNCTION agg_concatenate AS LANGUAGE 'C++' NAME 'ConcatenateFactory' LIBRARY AggregateFunctionsConcatenate; 

然後,你可以做一個查詢,如:

select id, rtrim(agg_concatenate(name || ', '),', ') ag 
from mytable 
group by 1 
order by 1 

使用RTRIM擺脫過去的 ''。

如果您需要以某種方式對聚合進行排序,則可能需要在內聯視圖或第一個視圖中選擇/排序。

+0

對不起,遲到的迴應。有沒有一個地方可以學習一般添加功能?我的意思是,你提供的命令我想學習,這樣我下次可以做其他用途。謝謝! – yabchexu

+0

如果你看看'/ opt/vertica/sdk/examples'目錄,你會發現很多其他的功能。還有一個通用make文件和一些sql文件,告訴你如何安裝和測試它們。 – woot

1
SELECT id, 
    MAX(DECODE(row_number, 1, a.name)) || 
    NVL(MAX(DECODE(row_number, 2, ',' || a.name)), '') || 
    NVL(MAX(DECODE(row_number, 3, ',' || a.name)), '') || 
    NVL(MAX(DECODE(row_number, 4, ',' || a.name)), '') || 
    NVL(MAX(DECODE(row_number, 5, ',' || a.name)), '') || 
    NVL(MAX(DECODE(row_number, 6, ',' || a.name)), '') || 
    NVL(MAX(DECODE(row_number, 7, ',' || a.name)), '') || 
    NVL(MAX(DECODE(row_number, 8, ',' || a.name)), '') || 
    NVL(MAX(DECODE(row_number, 9, ',' || a.name)), '') || 
    NVL(MAX(DECODE(row_number, 10, ',' || a.name)), '')|| 
    NVL(MAX(DECODE(row_number, 11, ',' || a.name)), '') || 
    NVL(MAX(DECODE(row_number, 12, ',' || a.name)), '') ag 
FROM 
    (SELECT id, name, ROW_NUMBER() OVER(PARTITION BY name ORDER BY id) row_number FROM test) a 
GROUP BY a.id 
ORDER BY a.id; 
+0

不是最乾淨的,但適用於無法安裝新代碼的問題。 – TrialAndError

0

另一種方法是使用strings package on githubGROUP_CONCAT

select id, group_concat(name) over (partition by id order by name) ag 
from mytable 

但也有采用這種方法一定的侷限性,因爲分析UDX不會讓你包括其他骨料(你就會有內聯,或與使用更多的數據添加到它)。