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>
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>
Considérations importantes:
total
permet des valeurs nulles, incluez NULLS LAST
dans la clause ORDER BY
pour garantir que les valeurs non nulles sont prioritaires. SELECT
n'est pas limitée aux colonnes dans DISTINCT ON
ou ORDER BY
. DISTINCT ON
est une extension spécifique au postgresql, pas une partie de SQL standard 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:
total
pour chaque client, puis sélectionnez la ligne avec le minimum id
pour ces clients. 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!