Bonsoir byacces2,
Comme l’a suggéré 78chris, vous pouvez utiliser la fonction TOP :
Requête 1 :
SELECT TOP 1 DateDebutUtilisation, Composant, Lot
FROM Lot
WHERE Composant ='C1' AND DateDebutUtilisation <='2015-01-25'
ORDER BY DateDebutUtilisation DESC ;
Ce qui nécessite de trier sur l’attribut DateDebutUtilisation dans le sens décroissant (ORDER BY DateDebutUtilisation DESC) et de retenir le 1er élément de la liste qui en résulte.
Pour ma part, je ne suis pas fan de cette fonction, car je la soupçonne de ne pas faire partie de la norme SQL, et puis elle n’est pas portable vers la plupart des autres SGBD.
J’ai donc préféré utiliser la fonction d’agrégation classique MAX. Décryptons.
On aimerait pouvoir écrire :
Requête 2 :
SELECT Composant, Max(DateDebutUtilisation) AS theDateDebutUtil, Lot
FROM lot WHERE Composant = 'C1' AND DateDebutUtilisation <= '2015-01-25' ;
Le problème est que la présence de la fonction MAX impose l’utilisation de GROUP BY. Essayons :
Requête 3 :
SELECT Composant, Max(DateDebutUtilisation) AS theDateDebutUtil, Lot
FROM lot WHERE Composant = 'C1' AND DateDebutUtilisation <= '2015-01-25'
GROUP BY Composant ;
Mais les colonnes présentes dans la partie SELECT doivent intégrer le GROUP BY :
Requête 4 :
SELECT Composant, Max(DateDebutUtilisation) AS theDateDebutUtil, Lot
FROM lot WHERE Composant = 'C1' AND DateDebutUtilisation <= '2015-01-25'
GROUP BY Composant, Lot ;
Mais on ne veut pas d’un regroupement par Composant, Lot, on ne veut regrouper que par Composant...
D’où la requête très « sage » que j’ai proposée dans mon précédent message, où l’on procède à la jointure du SELECT :
SELECT Composant, Max(DateDebutUtilisation) AS theDateDebutUtil
FROM lot WHERE Composant = 'C1' AND DateDebutUtilisation <='2015-01-25'
GROUP BY Composant
Avec avec la table lot pour justement récupérer le lot.
Il existe aussi une vieille astuce, une alternative consistant à remplacer Lot par MAX(Lot) dans le SELECT de la requête3 :
SELECT Composant, Max(DateDebutUtilisation) AS theDateDebutUtil, MAX(Lot) as theLot
FROM lot WHERE Composant = 'C1' AND DateDebutUtilisation <= '2015-01-25'
GROUP BY Composant ;
Bon, j’espère vous avoir apporté une solution...
Partager