2017-07-07 2 views
2

J'ai du mal à trouver un bon moyen de faire un DISTINCT en listagg en redshift.listagg avec DISTINCT en redshift

Tout ce que je veux faire est de lister la combinaison de produits, mais chaque ligne devrait renvoyer une liste de produits distincts.

Exemple

sortie souhaitée:

bulb, light 
bulb, light, fan 

au lieu de:

bulb, bulb, light 
bulb, bulb, light, fan 

Ci-dessous mon SQL:

select 
    tit.listagg 
from (
    SELECT 
     username, 
     listagg(node_name, ',') 
     WITHIN GROUP (ORDER BY node_name asc) 
    FROM table 
    Where node_type not like '%bla bla%' 
    GROUP BY username 
) as tit 
group by listagg; 
+0

Vous pouvez maintenant utiliser 'DISTINCT' dans' listagg' comme clause facultative. Plus de détails ici: https://docs.aws.amazon.com/redshift/latest/dg/r_LISTAGG.html –

Répondre

5

Vous pouvez en umerate les lignes, puis sélectionnez la première:

select username, 
     listagg(case when seqnum = 1 then node_name end, ',') within group (order by node_name asc) 
from (select t.*, 
      row_number() over (partition by username, node_name order by node_name) as seqnum 
     from table t 
     where node_type not like '%bla bla%' 
    ) t 
group by username; 

Il utilise la fonctionnalité qui ne tient pas compte listagg()NULL valeurs.

+0

réponse vraiment remarquable et rapide. J'ai réussi. :) –