215 votes

Postgres : Distinct mais seulement pour une colonne

J'ai une table sur pgsql avec des noms (ayant plus de 1 million de lignes), mais j'ai aussi beaucoup de doublons. Je sélectionne 3 champs : id , name , metadata .

Je veux les sélectionner au hasard avec ORDER BY RANDOM() y LIMIT 1000 Je fais donc cela en plusieurs étapes pour économiser de la mémoire dans mon script PHP.

Mais comment puis-je faire pour que cela ne me donne qu'une liste ne comportant aucun doublon dans les noms.

Par exemple [1,"Michael Fox","2003-03-03,34,M,4545"] sera retourné mais pas [2,"Michael Fox","1989-02-23,M,5633"] . Le champ du nom est le plus important et doit être unique dans la liste chaque fois que je fais la sélection et il doit être aléatoire.

J'ai essayé avec GROUP BY name mais il s'attend à ce que je dispose d'un identifiant et de métadonnées dans le fichier GROUP BY ainsi que dans une fonction d'agrégation, mais je ne veux pas qu'ils soient en quelque sorte filtrés.

Quelqu'un sait-il comment récupérer de nombreuses colonnes mais ne faire qu'un distinct sur une seule colonne ?

389voto

Clodoaldo Neto Points 26723

Pour faire une distinction sur une seule (ou n) colonne(s) :

select distinct on (name)
    name, col1, col2
from names

Cela renverra toutes les lignes contenant le nom. Si vous voulez contrôler les lignes qui seront retournées, vous devez les ordonner :

select distinct on (name)
    name, col1, col2
from names
order by name, col1

Renvoie la première ligne lorsqu'elle est classée par col1.

distinct on :

SELECT DISTINCT ON ( expression [, ...] ) ne conserve que la première ligne de chaque ensemble de lignes où les expressions données sont égales. Les expressions DISTINCT ON sont interprétées selon les mêmes règles que pour ORDER BY (voir ci-dessus). Notez que la "première ligne" de chaque ensemble est imprévisible, sauf si ORDER BY est utilisé pour s'assurer que la ligne souhaitée apparaît en premier.

L'expression ou les expressions DISTINCT ON doivent correspondre à l'expression ou aux expressions ORDER BY les plus à gauche. La clause ORDER BY contient normalement des expressions supplémentaires qui déterminent la préséance souhaitée des lignes dans chaque groupe DISTINCT ON.

31voto

Craig Ringer Points 72371

Quelqu'un sait-il comment récupérer de nombreuses colonnes mais ne faire qu'un distinct sur une seule colonne ?

Vous voulez le site DISTINCT ON clause .

Vous n'avez pas fourni d'échantillon de données ni de requête complète, je n'ai donc rien à vous montrer. Vous voulez écrire quelque chose comme :

SELECT DISTINCT ON (name) fields, id, name, metadata FROM the_table;

Cela renverra un ensemble de lignes imprévisibles (mais pas "aléatoires"). Si vous voulez que ce soit prévisible, ajoutez une option ORDER BY par la réponse de Clodaldo. Si vous voulez le rendre vraiment aléatoire, vous devez ORDER BY random() .

12voto

Sunil Kumar Points 193

Pour faire un distinct sur n colonnes :

select distinct on (col1, col2) col1, col2, col3, col4 from names

4voto

David Jashi Points 2626
SELECT NAME,MAX(ID) as ID,MAX(METADATA) as METADATA 
from SOMETABLE
GROUP BY NAME

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X