Select d'un maximum d'une colonne sachant un maximum d'une autre
Bonjour,
Je travaille sur 1 table (que j'appellerai ici "ventes") comprenant les champs suivants:
- Date_transaction
- ID_client
- ID_transaction
- montant_transaction (la PK est constituée de date de transaction + ID transaction).
Je cherche à relever la liste de toutes les dernières transactions pour chaque client.
Je pars donc sur un code comme ceci :
Code:
1 2 3 4 5
| Select t1.* FROM ventes t1
INNER JOIN (Select t1.ID_client, MAX(t1.Date_transaction) as DerniereDate from ventes t1
group by t1.ID_client) t2
ON t1.ID_client= t2.ID_client
AND t1.Date_transaction = t2.DerniereDate |
Ici, je crée une seconde table en partant de ventes avec seulement l'ID_client et la dernière date de transaction, pour récupérer avec l'inner join une table avec les dernières transactions de chaque client.
Le problème, c'est que s'il y a 2 dernières transactions pour un client à la même date, les 2 lignes apparaissent dans le tableau de résultat. Je cherche alors à ne garder dans ce cas précis seulement celle des deux lignes qui a le plus gros montant de transaction.
Je suis parti sur cette solution :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| WITH temptable AS (SELECT t1.*
FROM ventes t1
INNER JOIN (SELECT t1.ID_Client,
MAX(t1.Date_Transaction) AS DerniereDate
FROM ventes t1
GROUP BY t1.ID_Client
) t2
ON t1.ID_Client = t2.ID_Client
AND t1.Date_Transaction = t2.DerniereDate)
SELECT * FROM temptable m1
WHERE montant_transaction >= ALL (
SELECT montant_transaction
from temptable m2
where m1.ID_client = m2.ID_client
); |
Ici, j'ai mis tout le code précédent en With et ajouté un filtre where pour garder les lignes où le montant de transaction pour chaque client est supérieur ou égal à tous les autres du même client.
Ca marche, ça fait le job, mais ça ressemble plus à une astuce qu'à réellement une résolution de problème.
Ma question est, est-ce que je suis parti trop loin avec le With et est-ce qu'il y a possibilité de faire ça plus simplement et plus proprement avec une requête imbriquée dans le where ?
Je vous remercie.