Maison >base de données >tutoriel mysql >Comment résoudre l'erreur de clause ORDER BY incompatible avec DISTINCT ON de PostgreSQL ?

Comment résoudre l'erreur de clause ORDER BY incompatible avec DISTINCT ON de PostgreSQL ?

Susan Sarandon
Susan Sarandonoriginal
2025-01-21 12:08:11196parcourir

How to Resolve PostgreSQL's DISTINCT ON Mismatched ORDER BY Clause Error?

Dépannage de l'erreur de non-concordance de clause DISTINCT ON de PostgreSQL

La clause DISTINCT ON de PostgreSQL nécessite que l'expression ORDER BY corresponde précisément aux colonnes distinctes. Tenter une requête avec des expressions différentes entraînera une erreur. Le simple fait d'ajouter address_id comme premier élément de la clause ORDER BY, bien qu'il s'agisse d'une solution à l'erreur, pourrait ne pas renvoyer les résultats escomptés.

Voici des méthodes alternatives pour récupérer les données correctes sans modifier le ORDER BY dans la clause DISTINCT ON :

Méthode 1 : Approche du plus grand N-par-groupe (Agnostique du SGBD)

Cette méthode utilise une sous-requête pour trouver le maximum purchased_at pour chaque address_id, puis revient à la table d'origine pour récupérer la ligne complète :

<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 : Solution spécifique à PostgreSQL

Cette approche exploite une requête imbriquée, en utilisant DISTINCT ON dans la requête interne pour sélectionner la ligne souhaitée pour chaque address_id, puis en ordonnant les résultats finaux selon les besoins dans la requête externe :

<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 approches fournissent des solutions flexibles pour récupérer les données nécessaires tout en conservant l'ordre de tri souhaité, évitant ainsi de devoir faire des compromis sur l'expression DISTINCT ON de la clause ORDER BY.

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!

Déclaration:
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