Maison >base de données >tutoriel mysql >Comment récupérer efficacement la dernière ligne de chaque ID dans PostgreSQL ?

Comment récupérer efficacement la dernière ligne de chaque ID dans PostgreSQL ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-28 17:09:11400parcourir

How to Efficiently Retrieve the Last Row for Each ID in PostgreSQL?

PostgreSQL : Récupération de la dernière ligne pour chaque ID

Problème :

Étant donné les données suivantes, vous souhaitez extraire le dernier enregistrement pour chaque identifiant unique :

id    date          another_info
1     2014-02-01         kjkj
1     2014-03-11         ajskj
1     2014-05-13         kgfd
2     2014-02-01         SADA
3     2014-02-01         sfdg
3     2014-06-12         fdsA

Désiré Résultat :

id    date          another_info
1     2014-05-13         kgfd
2     2014-02-01         SADA
3     2014-06-12         fdsA

Solution :

Il existe deux méthodes efficaces pour y parvenir dans PostgreSQL :

Méthode 1 : Utilisation de l'opérateur DISTINCT ON

Postgres fournit l'opérateur DISTINCT ON, qui vous permet de sélectionner des lignes distinctes en fonction d'une ou plusieurs colonnes, puis d'appliquer d'autres opérations. Pour ce scénario, vous pouvez utiliser :

SELECT DISTINCT ON (id) id, date, another_info
FROM the_table
ORDER BY id, date DESC;

Méthode 2 : Utilisation d'une fonction de fenêtre

Les fonctions de fenêtre vous permettent d'effectuer des agrégations ou des calculs sur un ensemble de lignes qui peut être défini dynamiquement. Vous pouvez utiliser une fonction de fenêtre appelée ROW_NUMBER() pour attribuer un rang à chaque ligne de chaque groupe d'ID et sélectionner la ligne avec le rang le plus élevé :

SELECT id, date, another_info
FROM (
  SELECT id, date, another_info, 
         ROW_NUMBER() OVER (PARTITION BY id ORDER BY date DESC) AS rn
  FROM the_table
) t
WHERE rn = 1
ORDER BY id;

La solution utilisant une fonction de fenêtre est généralement plus rapide que d'utiliser une sous-requête.

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