Requêtes PostgreSQL DISTINCT : gestion des écarts ORDER BY
La clause DISTINCT ON
de PostgreSQL peut présenter des défis lorsque les expressions DISTINCT ON
ne correspondent pas aux critères ORDER BY
initiaux. En effet, DISTINCT ON
sélectionne la première ligne de chaque groupe défini par l'expression DISTINCT ON
, tel que déterminé par la clause ORDER BY
. Une commande incompatible entraîne des erreurs.
Pour corriger cela, la ou les expressions DISTINCT ON
doivent généralement être le critère principal dans la clause ORDER BY
. Cependant, si un ordre différent est préféré, des approches alternatives sont disponibles.
Méthodes alternatives pour la sélection de lignes uniques
Au lieu de vous fier uniquement à DISTINCT ON
, envisagez ces stratégies pour récupérer la ligne « supérieure » de chaque groupe en fonction d'un ordre choisi :
Méthode 1 : le plus grand N par groupe
Cette approche utilise des sous-requêtes pour identifier la valeur maximale (ou minimale) au sein de chaque groupe, puis rejoint la table d'origine pour récupérer la ligne correspondante. Voici un exemple :
<code class="language-sql">SELECT t1.* FROM purchases t1 JOIN ( SELECT address_id, max(purchased_at) as max_purchased_at FROM purchases WHERE product_id = 1 GROUP BY address_id ) t2 ON t1.address_id = t2.address_id AND t1.purchased_at = t2.max_purchased_at ORDER BY t1.purchased_at DESC;</code>
Méthode 2 : DISTINCT ON
Requête imbriquée
Une solution plus concise spécifique à PostgreSQL utilise des requêtes imbriquées :
<code class="language-sql">SELECT * FROM ( SELECT DISTINCT ON (address_id) * FROM purchases WHERE product_id = 1 ORDER BY address_id, purchased_at DESC ) t ORDER BY purchased_at DESC;</code>
Ces méthodes offrent une flexibilité dans la sélection de lignes uniques tout en gardant le contrôle sur le classement final, même lorsqu'il diffère des critères de regroupement. Choisissez la méthode qui convient le mieux à vos besoins spécifiques et à votre structure de données.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!