PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Comment obtenir la première ligne par groupe dans PostgreSQL

Parfois, vous devrez peut-être obtenir la première ligne par groupe dans PostgreSQL. Cela peut être une requête difficile en utilisant du SQL brut. Heureusement, PostgreSQL propose des fonctions de fenêtre pour de telles analyses de données. Voici comment obtenir la première ligne par groupe dans PostgreSQL.

Comment obtenir la première ligne par groupe dans PostgreSQL

Voici les étapes pour obtenir la première ligne par groupe dans PostgreSQL.

Disons que vous avez le tableau suivant product_sales qui contient des ventes par produit.

postgres=# create table product_sales(
             product varchar(255),
             order_date date, 
             sale int);

postgres=# insert into product_sales(product,order_date, sale)
           values('A','2020-05-01',250),
           ('B','2020-05-01',350),
           ('C','2020-05-01',1250),
           ('A','2020-05-02',450),
           ('B','2020-05-02',650),
           ('C','2020-05-02',1050),
           ('A','2020-05-03',150),
           ('B','2020-05-03',250),
           ('C','2020-05-03',1850);

postgres=# select * from product_sales;
 product | order_date | sale
---------+------------+------
 A       | 2020-05-01 |  250
 B       | 2020-05-01 |  350
 C       | 2020-05-01 | 1250
 A       | 2020-05-02 |  450
 B       | 2020-05-02 |  650
 C       | 2020-05-02 | 1050
 A       | 2020-05-03 |  150
 B       | 2020-05-03 |  250
 C       | 2020-05-03 | 1850

Supposons que vous souhaitiez obtenir la première ligne de chaque groupe, c'est-à-dire pour chaque produit. Vous pouvez facilement obtenir le premier enregistrement pour chaque groupe en utilisant WINDOW FUNCTION.

Lecture bonus :Comment obtenir le numéro de ligne dans PostgreSQL

Comment obtenir la première ligne par groupe dans PostgreSQL

Voici la requête SQL pour obtenir le premier enregistrement par groupe. Nous attribuons d'abord un numéro de ligne à chaque enregistrement par groupe.

postgres=# select
            *,
           row_number() over (partition by product order by order_date asc) 
           as row_number
           from product_sales;
 product | order_date | sale | row_number
---------+------------+------+------------
 A       | 2020-05-01 |  250 |          1
 A       | 2020-05-02 |  450 |          2
 A       | 2020-05-03 |  150 |          3
 B       | 2020-05-01 |  350 |          1
 B       | 2020-05-02 |  650 |          2
 B       | 2020-05-03 |  250 |          3
 C       | 2020-05-01 | 1250 |          1
 C       | 2020-05-02 | 1050 |          2
 C       | 2020-05-03 | 1850 |          3

Dans la requête ci-dessus, nous utilisons row_number() fonction pour attribuer un numéro de ligne à chaque enregistrement. Étant donné que nous avons besoin d'une numérotation distincte des lignes pour chaque groupe, nous utilisons PARTITION WINDOW FUNCTION. Nous disons à Postgresql de partitionner les lignes par chaque produit , c'est-à-dire et triez les lignes de chaque groupe par order_date

Ensuite, nous avons juste besoin d'utiliser le résultat ci-dessus pour sélectionner les lignes où row_number=1

postgres=# select *
           from (
            select
                *,
               row_number() over (partition by product order by order_date asc) 
               as row_number
             from product_sales
             ) temp where row_number=1;
 product | order_date | sale | row_number
---------+------------+------+------------
 A       | 2020-05-01 |  250 |          1
 B       | 2020-05-01 |  350 |          1
 C       | 2020-05-01 | 1250 |          1

La requête ci-dessus vous donnera le premier enregistrement de chaque groupe.

Lecture bonus :comment calculer le centile dans PostgreSQL

Comment obtenir la dernière ligne par groupe dans PostgreSQL

Si vous souhaitez obtenir la dernière ligne par groupe dans PostgreSQL, changez simplement l'ordre de tri dans la clause PARTITION de la requête ci-dessus de croissant à décroissant.

postgres=# select *
           from (
           select
             *,
             row_number() over (partition by product order by order_date desc) 
             as row_number
             from product_sales
           ) temp where row_number=1;
 product | order_date | sale | row_number
---------+------------+------+------------
 A       | 2020-05-03 |  150 |          1
 B       | 2020-05-03 |  250 |          1
 C       | 2020-05-03 | 1850 |          1

J'espère que vous pourrez obtenir le premier enregistrement de chaque groupe dans PostgreSQL.

Ubiq facilite la visualisation des données en quelques minutes et la surveillance dans des tableaux de bord en temps réel. Essayez-le aujourd'hui !