Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2424 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  [SQL] Group by relou

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[SQL] Group by relou

n°2294329
chico008
what the wookie says ?
Posté le 04-01-2017 à 12:33:03  profilanswer
 

Bonjour
 
Je travail actuellement sur une BDD en postgresql (9.5 je croit), j'ai une requete qui me pose soucis.
dans ma table, j'ai 3 champs a recuperer, dont un qui est une date/heure
 
j'effectue un recherche par le 1er champs, j'ai toute la liste.
Cependant, je cherche a effectuer uen recherche en filtrant le 1er champs, mais en ayant que la date la plus recente pour chaque champs 1
exemple de table

Code :
  1. APP     | DATE                       | TXT
  2. TOTOA | 2016/06/01 13:44:00 | hihi
  3. TOTOA | 2016/08/01 12:39:00 | haha
  4. TOTOB | 2016/07/02 11:36:00 | hoho


 
je voudrais avec ma requete avoir le resultat suivant :
TOTOA | 2016/08/01 12:39:00 | haha
TOTOB | 2016/07/02 11:36:00 | hoho
 
j'arrive avoir tout mes TOTOA et TOTOB, mais à chaque fois j'ai toutes les dates
voici ma requete de base
select APP, max(DATE), TXT from table where APP like '%TOTO%' group by APP, TXT;
 
j'ai essayé avec un distinct sur APP, mais rien à faire, je n'arrive pas au resultat que je veut


---------------
Serveur HFR - OpenTTD
mood
Publicité
Posté le 04-01-2017 à 12:33:03  profilanswer
 

n°2294331
Farian
Posté le 04-01-2017 à 12:48:24  profilanswer
 

Bonjour !
 
Le problème est sur le group by qui est fait sur les deux champs, alors qu'il ne devrait être fait que sur APP.
 
En l'état actuel, il groupe tous les enregistrements qui ont (APP,TXT) identiques, soit 3 groupes de 1 au total, pour lequel il sélectionne l'enregistrement le plus récent.
 
Bonne continuation


---------------
On n'est jamais très fort pour ce calcul !
n°2294332
chico008
what the wookie says ?
Posté le 04-01-2017 à 12:51:44  profilanswer
 

sauf que si je met que APP dans group by, il m'engueule car TXT n'est pas dans le group by ou dans une fonction d'aggregat
 
et sous mon postgres, la fonction last(TXT) ne fonctionne pas.


---------------
Serveur HFR - OpenTTD
n°2294338
Farian
Posté le 04-01-2017 à 13:24:22  profilanswer
 

Bonne remarque, j'avais oublié ce petit détail ...  
 
Du coup, est-ce vraiment faisable en une seule requête ?  
 
Avec une sous-requête, c'est faisable (pour peu que les dates soient distinctes par ville), mais c'est moche :(


---------------
On n'est jamais très fort pour ce calcul !
n°2294353
rufo
Pas me confondre avec Lycos!
Posté le 04-01-2017 à 14:13:33  profilanswer
 

En Mysql, ça passe de ne pas mettre tous les champs sauf agrégats dans le group by. Du coup, il va falloir passer par une sous-requête.


---------------
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
n°2294392
chico008
what the wookie says ?
Posté le 05-01-2017 à 07:06:28  profilanswer
 

je sais bien, Mysql est plus permissif/moins chiant
 
mais sous oracle et PostgreSQL, t'a pas le choix, t'es obliger de mettre tous les champs.
 
Du coup je veut bien de l'aide, car meme avec une sous-requete, je vois pas trop comment faire (et je maitrise pas du tout les sous-requetes)


---------------
Serveur HFR - OpenTTD
n°2294393
Farian
Posté le 05-01-2017 à 07:49:24  profilanswer
 

Bonjour !
 
Sans optimiser, et sous réserve que le couple (APP, date) soit unique :
 

Code :
  1. select * from table where (app, date) in (select APP, max(DATE) from table where APP like '%TOTO%' group by APP)


 
Il y a sans doute mieux et plus optimisé, mais, à froid de bon matin et n'étant pas un expert SQL, je ferais comme ça (car je ne sais pas trop comment faire mieux :) )
 
Bonne continuation !


---------------
On n'est jamais très fort pour ce calcul !
n°2294394
chico008
what the wookie says ?
Posté le 05-01-2017 à 07:51:19  profilanswer
 

bon, j'ai trouvé, c'est pas forcement propre
 

Code :
  1. select a.app, a.date, a.txt from matable as a, (select app, max(date) from matable where app like '%TOTO%' group by app) as b where a.app=b.app and a.date=b.max;


 
après, comme c'est du php, j'aurais pu aussi faire une 1ere requete pour trouver les 2 dates, puis refaire un requtes avec les 2 resultat, mais bon, j'avais envie de maximiser le SQL plutot que le PHP


---------------
Serveur HFR - OpenTTD
n°2294396
PierreC
Posté le 05-01-2017 à 09:59:14  profilanswer
 

renseigne toi du coté des windows function : https://www.postgresql.org/docs/9.5 [...] indow.html


---------------
Du tofu en Alsace : www.tofuhong.com

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  [SQL] Group by relou

 

Sujets relatifs
Rechercher une chaine qui ressemble à une autre en SQLSQL Requete Union
SQL Server ou SQL Express ?Probleme version de Wamp : SQL, PHP, et surtout de moi
Sql server un champ avec 3 choix[SQL] Programme gratuit pour tester des requêtes SQL
[SQL Server / Cobol GCOS] Insert Varchar sans espace[SQL] Question sur une requête
[SQL] Filtrer les chiffres[SQL Server] clé étrangère et Check constraint - NULL
Plus de sujets relatifs à : [SQL] Group by relou


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR