2017-08-30 5 views
0

Equivalent de LISTAGG dans Vertica Bonjour à tous! J'essaie d'agréger toutes les valeurs de champ d'un groupe particulier dans un champ. Par exemple, ma table d'entrée ressemble à: -LISTAGG in vertica

FIELD1 GROUP1 

A 1 

A 2 

B 1 

B 2 

C 1 

C 3 

3 null 

et ma sortie devrait ressembler à: -

1 A,B,C 

2 A,B 

3 C 

je peux en arriver sur Oracle en utilisant la fonction suivante

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

Y a-t-il un moyen de le faire dans Vertica? Toute aide serait appréciée !!

Répondre

2

vous avez pas de fonction intégrée mais vous pouvez utiliser UDX voir vertica github vous avez besoin GroupConcat fonction

+0

Merci pour votre réponse. J'ai essayé de créer un UDF avec la commande ci-dessous. CREATE LIBRARY AggregateFunctionsConcatenate AS '/opt/vertica/sdk/examples/AggregateFunctions/Concatenate.so'; CREATE AGGREGATE FUNCTION agg_group_concat EN LANGAGE 'C++' NAME 'ConcatenateFactory'LIBRARY AggregateFunctionsConcatenate; mais obtenir ci-dessous Erreur: [Code: 4746, État SQL: 42V13] [Vertica] [VJDBC] (4746) ROLLBACK: La fonction de configuration "ConcatenateFactory" a échoué undefined symbole: getConcatenateFactory –

+0

désolé Mon mauvais, je donnais une usine incorrecte nom –

+0

obtenant actuellement: [Code: 4746, État SQL: 42V13] [Vertica] [VJDBC] (4746) ROLLBACK: Configuration de la fonction "agg_group_concat" échouée [Vertica] [VJDBC] Détail: [Type d'usine incompatible] –

2

Jetez un oeil sur ma mise en œuvre de LISTAGG, il imite en fait une fonction Oracle LISTAGG. GROUP_CONCAT et CONCATENATE dans le hub git ont certains inconvénients.

Compile:

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 

Installation:

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

Exemple:

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

Cela ressemble à une fonction de transformation ... pas à un agrégat. – mauro

+0

@mauro donc vérifiez par vous-même, c'est une fonction analytique;) – sKwa

+0

@mauro exactement, c'était une erreur, après avoir changé à la fonction de transformation tout a fonctionné –