Maison > base de données > tutoriel mysql > Comment interroger des lignes DISTINCT dans PostgreSQL avec différents critères ORDER BY ?

Comment interroger des lignes DISTINCT dans PostgreSQL avec différents critères ORDER BY ?

Mary-Kate Olsen
Libérer: 2025-01-21 12:26:09
original
461 Les gens l'ont consulté

How to Query DISTINCT Rows in PostgreSQL with Different ORDER BY Criteria?

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>
Copier après la connexion

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal