Toute la puissance de DISTINCT ON avec PostgreSQL
Par footcow le lundi, 17 décembre 2007, 00:33 - PostgreSQL - Lien permanent
Qui n'a pas eu le besoin un jour de ressortir un listing contenant le détail de toutes les dernières commandes de ses clients ?
Jusque là ... il fallait souvent passer par des sous SELECT, un MAX et une vitesse de calcul pas souvent au rendez-vous ...
Du genre :
SELECT c.id, c.nom, f.id, f.date, f.total
FROM (clients c INNER JOIN factures f ON c.id = f.id)
INNER JOIN
(SELECT MAX(date) AS date_derniere_facture, id
FROM factures
GROUP BY id) AS mf ON mf.date_derniere_facture = f.date AND mf.id = c.id
Si vous êtes un utilisateur de PostgreSQL, vous pouvez vous simplifier la vie en utilisant la fonction DISTINCT ON, de la façon suivante :
SELECT DISTINCT ON (c.id) c.id, c.nom, f.id, f.date, f.total FROM clients c LEFT JOIN factures f ON c.id = f.id ORDER BY c.id, f.date DESC, f.id DESC;
Et le tour est joué, dans un temps record.

Bonjour, Je suis Hervé Piedvache. Footcow est mon pseudo. Passionné d'informatique, Linux, base de données PostgreSQL, développement de logiciels, Emailing et d'Internet en général.