顶部的 LISTAGG

LISTAGG in vertica

相当于 Vertica 中的 LISTAGG 大家好! 我试图在一个字段中聚合特定组的所有字段值。 例如,我的输入 table 看起来像:-

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 中执行此操作吗? 任何帮助将不胜感激!!

您没有内置功能,但可以使用UDX 参见 vertica github 您需要 GroupConcat 函数

看看我对 LISTAGG 的实现,它实际上模仿了 Oracle 函数 LISTAGGGROUP_CONCATCONCATENATE 在 git 中心有一些劣势。

编译:

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)

Vertica 刚刚在最新的 9.1.1 中添加了对 LISTAGG 的支持:https://www.vertica.com/docs/9.1.x/HTML/index.htm#Authoring/SQLReferenceManual/Functions/Aggregate/LISTAGG.htm

但是,它不支持 ORDER BY 子句,但您可以使用此解决方法:

select listagg(col1), col2
from (
  select col1, col2 from table1 order by col2, col1
) x
group by col2