Maison > base de données > tutoriel mysql > Comment récupérer la première entrée de chaque groupe dans PostgreSQL ?

Comment récupérer la première entrée de chaque groupe dans PostgreSQL ?

Linda Hamilton
Libérer: 2025-01-25 20:11:11
original
698 Les gens l'ont consulté

How to Retrieve the Earliest Entry for Each Group in PostgreSQL?

sélectionnant efficacement la première ligne de chaque groupe dans PostgreSQL

Ce guide montre comment récupérer efficacement la première entrée pour chaque groupe de PostgreSQL, une tâche courante lorsque vous travaillez avec des données groupées. La méthode la plus efficace utilise la clause DISTINCT ON.

Tiration de la clause DISTINCT ON

La clause DISTINCT ON de PostgreSQL fournit un moyen concis et efficace de sélectionner la première ligne de chaque groupe défini par des colonnes spécifiées. Sa syntaxe est simple:

<code class="language-sql">SELECT DISTINCT ON (column_list)
FROM table_name
ORDER BY column_list, ...;</code>
Copier après la connexion

Exemple: Identification du premier achat pour chaque client

Considérons une table purchases avec des colonnes id, customer et total. Pour trouver l'achat le plus ancien (basé sur la colonne id) pour chaque client avec le total le plus élevé, utilisez cette requête:

<code class="language-sql">SELECT DISTINCT ON (customer)
       id, customer, total
FROM   purchases
ORDER  BY customer, total DESC, id;</code>
Copier après la connexion

Considérations importantes:

  • Manipulation nul: Si la colonne total permet des valeurs nulles, incluez NULLS LAST dans la clause ORDER BY pour garantir que les valeurs non nulles sont prioritaires.
  • Sélectionner la flexibilité de la liste: La liste SELECT n'est pas limitée aux colonnes dans DISTINCT ON ou ORDER BY.
  • Spécificité postgresql: DISTINCT ON est une extension spécifique au postgresql, pas une partie de SQL standard
  • Ordonnance alternative: pour commander les résultats finaux différemment de l'ordre de regroupement, nid la requête et appliquer une clause secondaire ORDER BY.

Optimisation des performances avec l'indexation:

Création d'un index multi-colonnes sur (customer, total DESC, id) Améliore considérablement les performances de la requête, en particulier lorsque le nombre de lignes par client est relativement petit.

Approches alternatives pour les grands ensembles de données:

Pour les ensembles de données avec de nombreuses lignes par client, les stratégies alternatives peuvent être plus efficaces:

  • Sous-questionnées: Utilisez une sous-requête ou une sous-requête corrélée pour trouver le maximum total pour chaque client, puis sélectionnez la ligne avec le minimum id pour ces clients.
  • Tables / CTES temporaires: Créez une table temporaire ou une expression de table commune (CTE) contenant des clients uniques et rejoignez-le avec la table d'origine pour récupérer les lignes souhaitées. Cette approche peut être bénéfique pour les scénarios complexes.

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