J'ai besoin d'interroger une base de données SQL pour trouver toutes les valeurs distinctes d'une colonne et j'ai besoin d'une valeur arbitraire d'une autre colonne. Par exemple, considérez le tableau suivant avec deux colonnes, clé et valeur:
key value
=== =====
one test
one another
one value
two goes
two here
two also
three example
Je souhaite récupérer un exemple de ligne, choisi arbitrairement, à partir de chaque clé distincte, en obtenant peut-être ces trois lignes:
key value
=== =====
one test
two goes
three example
Comment puis-je formuler une telle requête en SQL?
Réponses:
La requête la plus simple à écrire concerne MySQL (avec des paramètres ANSI non stricts). Il utilise la construction non standard:
Dans la version récente (5.7 et 8.0+) où les paramètres stricts et
ONLY_FULL_GROUP_BY
par défaut, vous pouvez utiliser laANY_VALUE()
fonction, ajoutée en 5.7:Pour les autres SGBD, qui ont des fonctions de fenêtre (comme Postgres, SQL-Server, Oracle, DB2), vous pouvez les utiliser comme ceci. L'avantage est que vous pouvez également sélectionner d'autres colonnes dans le résultat (en plus de
key
etvalue
):Pour les anciennes versions de ce qui précède et pour tout autre SGBD, une manière générale qui fonctionne presque partout. Un inconvénient est que vous ne pouvez pas sélectionner d'autres colonnes avec cette approche. Un autre est que les fonctions d'agrégation aiment
MIN()
etMAX()
ne fonctionnent pas avec certains types de données dans certains SGBD (comme bit, texte, blobs):PostgreSQL dispose d'un
DISTINCT ON
opérateur spécial non standard qui peut également être utilisé. L'option facultativeORDER BY
consiste à sélectionner la ligne de chaque groupe à sélectionner:la source
ORDER BY whatever
requête dans ypercube par un appel à une fonction pour randomiser les résultats.Pour le serveur MS-SQl:
De même, vous pourriez avoir rownum = 2 pour votre deuxième jeu de résultats
la source
Similaire à la réponse acceptée, mais au lieu de min () ou max (), vous pouvez utiliser array_agg ()
Vous pouvez éventuellement classer les valeurs dans le tableau pour en sélectionner le plus grand ou le plus petit:
(vérifié sur PostgreSQL)
la source