/ / LISTAGG in vertica - vertica, listagg

LISTAGG in vertica - vertica, listagg

Odpowiednik LISTAGG w Vertica Cześć wszystkim! Próbuję zebrać wszystkie wartości pól określonej grupy w jednym polu. Na przykład Moja tabela wejściowa wygląda następująco: -

FIELD1 GROUP1

A 1

A 2

B 1

B 2

C 1

C 3

3 null

a moje wyniki powinny wyglądać jak:

1 A,B,C

2 A,B

3 C

Obecnie mogę to osiągnąć w Oracle przy użyciu poniższej funkcji

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

Czy jest sposób, w jaki mogę to zrobić w Vertica. Każda pomoc będzie doceniona !!

Odpowiedzi:

2 dla odpowiedzi № 1

nie masz wbudowanej funkcji, ale możesz korzystać z UDX widzieć vertica github potrzebujesz funkcji GroupConcat


2 dla odpowiedzi nr 2

Spójrz na moją implementację LISTAGG, to faktycznie naśladuje funkcję Oracle LISTAGG. GROUP_CONCAT i CONCATENATEw hubie git mają pewne upośledzenie.

Skompilować:

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

Zainstalować:

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

Przykład:

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)