就拿我的执行LISTAGG一看,它实际上模仿一个Oracle功能LISTAGG
。 git hub中的GROUP_CONCAT
和CONCATENATE
有一些不利之处。
编译:
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)
感谢您的答复。我试图用下面的命令创建一个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 –
对不起,我给错误的工厂名称 –
当前正在获取:[代码:4746,SQL状态:42V13] [Vertica] [VJDBC](4746)ROLLBACK:设置函数“agg_group_concat”失败 [Vertica] [VJDBC]详细信息:[不兼容的工厂类型] –