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 № 1nie 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 CONCATENATE
w 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)