[SQL] Group by relou

Group by relou [SQL] - SQL/NoSQL - Programmation

Marsh Posté le 04-01-2017 à 12:33:03    

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
Reply

Marsh Posté le 04-01-2017 à 12:33:03   

Reply

Marsh Posté le 04-01-2017 à 12:48:24    

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 !
Reply

Marsh Posté le 04-01-2017 à 12:51:44    

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
Reply

Marsh Posté le 04-01-2017 à 13:24:22    

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 !
Reply

Marsh Posté le 04-01-2017 à 14:13:33    

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
Reply

Marsh Posté le 05-01-2017 à 07:06:28    

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
Reply

Marsh Posté le 05-01-2017 à 07:49:24    

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 !
Reply

Marsh Posté le 05-01-2017 à 07:51:19    

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
Reply

Marsh Posté le 05-01-2017 à 09:59:14    

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


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

Sujets relatifs:

Leave a Replay

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