filtrage de n-uplet à partir d'un minimum

filtrage de n-uplet à partir d'un minimum - SQL/NoSQL - Programmation

Marsh Posté le 11-05-2006 à 11:45:36    

Salut, j'ai un problème de requete :
 
J'ai une table (issue d'une autojointure pour info) de la forme :
a(i) , b(i,k) , date(i,k)
 
exemple :
a1 , b11 , date11
a1 , b12 , date12
a1 , b13 , date13
...
a2 , b21 , date21
a2 , b22 , date22
a2 , b23 , date23
...
 
je voudrais des couples (a , b), groupés par a, avec le b dont la date associée est la plus petite pour un a donné
exemple :
a1, b12, date12 (où date12 est le min de (date11, date12, date13))
a2, b21, date21 (où date21 est le min de (date21, date22, date23))
etc...
 
donc je suis parti connement sur un "select a,b,min(date) from matable group by a" mais là il faut que la
clé b soit celle dont la date est la plus petite.  
 
On peut faire aussi un select a,b,min(date) from matable order by a,date group by a : ça marche ? mais ça me semble foireux.
Quelle est la bonne approche professionnelle ?
 
Merci par avance

Reply

Marsh Posté le 11-05-2006 à 11:45:36   

Reply

Marsh Posté le 11-05-2006 à 12:24:14    

Bon je tiens UNE soluce :  
 
select t1.a,t1.b,t1.temps
from (
       select a , b, temps from atest
       order by a asc, temps asc
) t1
group by a
 
mais je suis sûr qu'on peut éviter la sous-requete

Reply

Marsh Posté le 11-05-2006 à 16:13:19    

ca m'étonne que ca marche ta soluce...
t'es sûr que t'as pas une erreur de type b et temps ne font pas partie du group by ???
 
Si tu es sur Oracle, les fonctions analytiques marchent très bien pour ces cas :
 
select a, b, date from
(select a, b, date, min(date) over (partition by a, b) min_date
  from table)
where date = min_date

Reply

Marsh Posté le 11-05-2006 à 16:51:32    

moonboot a écrit :

ca m'étonne que ca marche ta soluce...
t'es sûr que t'as pas une erreur de type b et temps ne font pas partie du group by ???


 
ouais, je sais c'est bizarre. En fait, ça marche parce que le group by prend la 1ere ligne du groupe et que c'est ordonné par date. C'est clair que c'est foireux.
 

Citation :


Si tu es sur Oracle, les fonctions analytiques marchent très bien pour ces cas :


 
malheureusement, je suis sur mysql.

Reply

Marsh Posté le 12-05-2006 à 16:52:19    

je t'ai dis des betises sous oracle c'est :
 
select a, b, date from
(select a, b, date, min(date) over (partition by a) min_date
  from table)
where date = min_date
 
sous mysql ceci devrait marcher :
 
select table.a, table.b, table.date
from
(select a, min(date) min_date
from table
group by a) toto,
table
where table.a = toto.a and table.date = toto.min_date

Reply

Marsh Posté le 15-05-2006 à 09:30:23    

Ah voilà ! ça, ça me semble très bien :jap:
Et c'est logique.
 
Merci bien moonboot :jap:

Reply

Sujets relatifs:

Leave a Replay

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