Footcow Blog - Mot-clé - distinct onLinux, Base de données Postgresql, développement, Internet, emailing et déliverabilité.2024-03-28T09:21:39+01:00Hervé Piedvache alias Bill Footcow pour les intimesurn:md5:ef5d07bad25e414feca607a3b7f2af11DotclearToute la puissance de DISTINCT ON avec PostgreSQLurn:md5:d38f398e58440b5a2f163f67916d0cd32007-12-17T00:33:00+01:002007-12-17T00:35:14+01:00footcowPostgreSQLdistinct onoptimisationpostgresql <p>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 ?<br /></p>
<p>Jusque là ... il fallait souvent passer par des sous SELECT, un MAX et une vitesse de calcul pas souvent au rendez-vous ...<br />
Du genre :<br /></p>
<pre>
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
</pre>
<p>Si vous êtes un utilisateur de <a href="https://www.postgresql.org" hreflang="en">PostgreSQL</a>, vous pouvez vous simplifier la vie en utilisant la fonction DISTINCT ON, de la façon suivante :<br /></p>
<pre>
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;
</pre>
<p>Et le tour est joué, dans un temps record.</p>https://www.footcow.com/index.php/post/2007/12/17/Toute-la-puissance-de-DISTINCT-ON-avec-PostgreSQL#comment-formhttps://feeds.feedburner.com/FootcowBlog/comments/34