Maison >base de données >tutoriel mysql >Comment puis-je supprimer les doublons lors de l'utilisation de la fonction LISTAGG d'Oracle ?
Oracle LISTAGG : Gestion des valeurs en double pour des résultats uniques
La fonction LISTAGG d'Oracle, bien que puissante pour agréger des données, ne supprime pas automatiquement les entrées en double. Il concatène toutes les valeurs, y compris les répétitions, en une seule chaîne. Voici comment obtenir une agrégation de valeurs distincte :
Méthode pour Oracle 19c et versions ultérieures :
Oracle 19c et versions ultérieures proposent une solution simplifiée :
<code class="language-sql">SELECT LISTAGG(DISTINCT the_column, ',') WITHIN GROUP (ORDER BY the_column) FROM the_table;</code>
Ceci intègre directement le mot-clé DISTINCT
dans la fonction LISTAGG
elle-même.
Méthode pour Oracle 18c et versions antérieures :
Pour les anciennes versions (18c et inférieures), une sous-requête est nécessaire :
<code class="language-sql">SELECT LISTAGG(the_column, ',') WITHIN GROUP (ORDER BY the_column) FROM ( SELECT DISTINCT the_column FROM the_table ) t;</code>
Ceci sélectionne d'abord uniquement les valeurs uniques dans une sous-requête, puis s'applique LISTAGG
à ce résultat.
Inclure plusieurs colonnes :
Pour inclure des colonnes supplémentaires et conserver l'unicité, une approche plus avancée est nécessaire :
<code class="language-sql">SELECT col1, LISTAGG(col2, ',') WITHIN GROUP (ORDER BY col2) FROM ( SELECT col1, col2, ROW_NUMBER() OVER (PARTITION BY col1, col2 ORDER BY col1) AS rn FROM foo ORDER BY col1, col2 ) WHERE rn = 1 GROUP BY col1;</code>
Ceci utilise ROW_NUMBER()
pour attribuer un rang unique à chaque combinaison de col1
et col2
. La requête externe sélectionne ensuite uniquement la première occurrence (rn = 1) pour chaque combinaison unique, garantissant ainsi que les doublons sont éliminés avant l'agrégation.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!