SQL DISTINCT requete spéciale (POSTGRESQL)

SQL DISTINCT requete spéciale (POSTGRESQL) - SQL/NoSQL - Programmation

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  

Code :
  1. RACINE1 URL1 TITRE1
  2. RACINE1 URL2 TITRE2
  3. RACINE1 URL3 TITRE3
  4. RACINE2 URL4 TITRE4
  5. RACINE2 URL5 TITRE5
  6. RACINE2 URL6 TITRE6


avoir juste

Code :
  1. RACINE1 URL1 TITRE1
  2. RACINE2 URL4 TITRE4



---------------
http://www.ypikay.com
Reply

Marsh Posté le 06-04-2020 à 21:04:52   

Reply

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 :o).


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

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   ??


---------------
http://www.ypikay.com
Reply

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


Message édité par erwan83 le 06-04-2020 à 22:37:35

---------------
http://www.ypikay.com
Reply

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.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 06-04-2020 à 22:46:27    

merci je vais voir ca


---------------
http://www.ypikay.com
Reply

Marsh 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
 

Reply

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 ? )


---------------
Nom : Prénom : Age : Adresse : Ville : Code Postal : Num Trois Tel
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed