SQL DISTINCT requete spéciale (POSTGRESQL) - SQL/NoSQL - Programmation
Marsh Posté le 06-04-2020 à 22:22:06
GROUP BY RACINE ?
Evite le distinct, c'est assez lent. Group by est plus rapide. Par contre, certains SGBD rigoristes par rapport à la norme interdisent de mettre dans le group by moins de champs qu'il n'y en a dans le select (on retire bien entendu les champs de type aggrégation genre MAX, count, SUM...). Mysql le tolère alors que Firebird non (si on considère que c'est un SGBD ).
Marsh Posté le 06-04-2020 à 22:33:36
Merci. j'ai jamais compris le group by.
Parce que là j'essaye de le caler dans tous les coins ça m'envoie bouler.
SELECT RACINE,URL,TITLE,PREUVE,POIDS FROM TABLE GROUP BY URL ??
Marsh Posté le 06-04-2020 à 22:36:48
SELECT RACINE,URL,TITLE,PREUVE,POIDS FROM _requete__goodmoon GROUP BY URL
Query failed: ERREUR: la colonne « _requete__goodmoon__.racine » doit apparaître dans la clause GROUP BY ou doit être utilisé dans une fonction d'agrégat
Marsh Posté le 06-04-2020 à 22:41:03
SELECT RACINE,URL,TITLE,PREUVE,POIDS FROM TABLE GROUP RACINE.
Dans Mysql, ça passerait. Mais comme expliqué, certains SGBD à cheval sur la norme râlent avec ce genre de requête.
Donc si ce que j'ai mis marche pas, c'est que Postgres est à cheval sur la norme.
Marsh Posté le 06-04-2020 à 22:46:27
ReplyMarsh Posté le 23-05-2020 à 17:56:07
Ca ne va pas plaire à Postgres.
J'essayerais de rajouter des min/max.
SELECT RACINE, max(URL), max(TITLE), max(PREUVE), max(POIDS) FROM TABLE GROUP 1
Après si tu veux vraiment la première occurence de chaque group, il va falloir regarder du coté des rank et des partitions.
dd
Marsh Posté le 05-06-2021 à 21:09:30
Bonjour erwan83 ,
la clause DISTINCT affiche chaque champ présent dans la table.
ex :
un champ a la même valeur 25 fois. ( un nom de famille par exemple )
la requête va te renvoyer 25 lignes.
Pour l'usage de "GROUP BY", c'est un impératif dès que tu utilises max( ) , min( ) , etc .... ou les alias pour renommer une colonne.
c'est le moteur SQL qui a besoin de ce regroupement, pour travailler sur les lignes de la colonne concernée.
C'est vraiment un comportement d'ordinateur ( bête et re-bête ).
Une requete SQL , c'est une instance, c'est une instruction pour le moteur SQL.
Mal écrite, c'est 'error num x000 .....'.
le 'group by' est attendu, comme paramètre, dès les fonctions de calculs sur colonnes. l'un sans l'autre ne marchera jamais.
Si tu souhaites en savoir plus :
regardes ce qu'est "l'algèbre relationnel",
c'est les 'opérations de bases' pour l'éxècution des requêtes dans les technos Db.
tu verra pourquoi sans le GROUP BY , les min / max / avg / alias font 'bug'.
{ MIN / MAX / AVG / ALIAS.. opérations sur colonnes } ===> GROUP BY
Bien sur c'est sur la norme SQL , il y a quelques libertés selon les moteurs. ( ou un setup à faire ? )
Marsh Posté le 06-04-2020 à 21:04:52
Bonjour
J'ai plusieurs champs: URL, TITRE, TEXT, RACINE .....
Je voudrais pouvoir retourner un seul exemplaire de RACINE tout en retournant les autres colonnes.
Si je demande SELECT DISTINCT RACINE FROM TABLE WHERE... il me retournera toutes les racines différentes sans doublons, mais je n'ai que RACINE
Si je demande SELECT DISTINCT RACINE, URL, TITRE FROM TABLE WHERE il me retournera toutes les racines avec doublons (comme dans le premier exemple ci dessous)
Je voudrais donc faire mon tri et, dès que je trouve une valeur RACINE différente, j'affiche la ligne (comme dans le dernier exemple)
Au lieu de
avoir juste
---------------
http://www.ypikay.com