Maison > base de données > tutoriel mysql > Comment trouver la première ligne de chaque groupe à l'aide de la clause DISTINCT ON de PostgreSQL ?

Comment trouver la première ligne de chaque groupe à l'aide de la clause DISTINCT ON de PostgreSQL ?

Barbara Streisand
Libérer: 2025-01-25 20:17:18
original
267 Les gens l'ont consulté

How to Find the First Row in Each Group Using PostgreSQL's DISTINCT ON Clause?

Trouvez la première ligne de chaque groupe

Introduction

Lors du traitement des données de groupe, la première ligne de chaque groupe doit être extraite. Cette tâche peut être effectuée à l'aide de la clause , qui est une fonction d'extension unique de PostgreSQL.

Structure de requête DISTINCT ON

grouping_expression:

L'expression utilisée pour définir le regroupement. L'expression guidée avant dans cette clause doit correspondre à l'expression dans la clause

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

selectd_columns: les colonnes à récupérer dans la sortie. ORDER BY Additional_ordering_Expression (s):

Expression facultative utilisée pour déterminer l'ordre de chaque groupe. Ces expressions doivent être suivies après l'expression du groupe dans la clause .

Exemple Considérons

Tableau:

et les données suivantes: ORDER BY

Pour récupérer les clients avec le montant d'achat total le plus élevé, veuillez utiliser les demandes suivantes:

purchases Sortie:

<code class="language-sql">CREATE TABLE purchases (
    id SERIAL PRIMARY KEY,
    customer VARCHAR(50) NOT NULL,
    total NUMERIC(10, 2) NOT NULL
);</code>
Copier après la connexion

Valeur nul
<code class="language-sql">INSERT INTO purchases (customer, total) VALUES
('Joe', 5),
('Sally', 3),
('Joe', 2),
('Sally', 1);</code>
Copier après la connexion

Si la valeur de groupe peut contenir la valeur nul, il est recommandé d'ajouter

à la clause
<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
pour s'assurer que le traitement prioritaire a une valeur non nul:

Sélectionnez d'autres colonnes

La liste n'est pas limitée à l'expression du groupe. Il peut contenir d'autres colonnes, ce qui permet à cette technologie de remplacer les fonctions complexes de sous-requête ou d'agrégat / fenêtre.
<code>id | customer | total
-----------------------------
1  | Joe      | 5
2  | Sally    | 3</code>
Copier après la connexion

Précautions de performance

L'efficacité de la requête dépend de la distribution des données et du nombre de lignes de chaque groupe. Pour les petits groupes, il est généralement très efficace. Cependant, pour les grands groupes, la technologie alternative décrite dans le lien suivant peut fournir de meilleures performances: ORDER BY NULLS LAST

La distance de sélection dans PostgreSQL est plus lente que prévu
<code class="language-sql">ORDER  BY customer, total DESC NULLS LAST, id;</code>
Copier après la connexion

Optimiser le groupe par requête pour récupérer la dernière ligne de chaque utilisateur

SELECT

Enquête les Nives liées au dernier N de chaque ligne

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