2017-08-30 311 views
0

Vertica中LISTAGG的等效 大家好! 我试图在一个字段中汇总特定组的所有字段值。 例如,我的输入表如下所示: -Vertica中的LISTAGG

FIELD1 GROUP1 

A 1 

A 2 

B 1 

B 2 

C 1 

C 3 

3 null 

和我的输出应该是这样的: -

1 A,B,C 

2 A,B 

3 C 

我目前可以做到这一点在Oracle通过以下功能

SELECT GROUP1, LISTAGG(FIELD1, ',') WITHIN GROUP (ORDER BY FIELD1) AS GROUPED_FIELD 
FROM <INPUT_TABLE> 
GROUP BY GROUP1; 

有什么办法可以在Vertica中做到这一点。 任何帮助将不胜感激!

回答

2

你有没有内置的功能,但你可以使用UDX 看到vertica github你需要GroupConcat功能

+0

感谢您的答复。我试图用下面的命令创建一个UDF。 CREATE LIBRARY AggregateFunctionsConcateate AS'/opt/vertica/sdk/examples/AggregateFunctions/Concatenate.so'; CREATE AGGREGATE FUNCTION agg_group_concat AS LANGUAGE'C++'NAME'ConcatenateFactory'LIBRARY AggregateFunctionsConcatenate; 但得到以下错误: [代码:4746,SQL状态:42V13] [Vertica] [VJDBC](4746)ROLLBACK:设置函数“ConcatenateFactory”失败 undefined symbol:getConcatenateFactory –

+0

对不起,我给错误的工厂名称 –

+0

当前正在获取:[代码:4746,SQL状态:42V13] [Vertica] [VJDBC](4746)ROLLBACK:设置函数“agg_group_concat”失败 [Vertica] [VJDBC]详细信息:[不兼容的工厂类型] –

2

就拿我的执行LISTAGG一看,它实际上模仿一个Oracle功能LISTAGG。 git hub中的GROUP_CONCATCONCATENATE有一些不利之处。

编译:

g++ -D HAVE_LONG_INT_64 -I /opt/vertica/sdk/include \ 
    -Wall -shared -Wno-unused-value -fPIC   \ 
    -o ListAggLib.so ListAgg.cpp /opt/vertica/sdk/include/Vertica.cpp 

安装:

CREATE LIBRARY ListAggLib AS '/home/dbadmin/ListAggLib.so'; 
CREATE ANALYTIC FUNCTION ListAgg AS LANGUAGE 'C++' NAME 'ListAggFactory' LIBRARY ListAggLib; 

例子:

dbadmin=> select * from foo; 
id | date | val 
----+------------+----- 
    1 | 2000-01-01 | rus 
    1 | 2000-01-01 | usa 
    1 | 2000-01-02 | usa 
    1 | 2000-01-03 | eng 
    2 | 2000-01-01 | afg 
    2 | 2000-01-02 | eng 
(6 rows) 

dbadmin=> select distinct id, ListAgg(val) over(partition by id) from foo; 
id | ?column?  
----+----------------- 
    1 | rus,usa,usa,eng 
    2 | afg,eng 
(2 rows) 

dbadmin=> select id, val, 
dbadmin-> ListAgg(val) over(partition by id) from foo group by id, val order by id; 
id | val | ?column? 
----+-----+------------- 
    1 | eng | eng,rus,usa 
    1 | rus | eng,rus,usa 
    1 | usa | eng,rus,usa 
    2 | afg | afg,eng 
    2 | eng | afg,eng 
(5 rows) 

dbadmin=> select 
dbadmin->  id, 
dbadmin->  val, 
dbadmin->  ListAgg(val using parameters delimiter=';') over(partition by id) 
dbadmin-> from foo 
dbadmin-> group by id, val 
dbadmin-> order by id; 
id | val | ?column? 
----+-----+------------- 
    1 | eng | eng;rus;usa 
    1 | rus | eng;rus;usa 
    1 | usa | eng;rus;usa 
    2 | afg | afg;eng 
    2 | eng | afg;eng 
(5 rows) 
+0

它看起来像一个转换功能...不是一个聚合。 – mauro

+0

@mauro所以检查你的自己,它的一个分析功能;) – sKwa

+0

@mauro完全,这是一个错误,后改为它转换功能一切正常 –