sql >> Database teknologi >  >> RDS >> PostgreSQL

Sådan får du første række pr. gruppe i PostgreSQL

Nogle gange skal du muligvis få første række pr. gruppe i PostgreSQL. Dette kan være en vanskelig forespørgsel ved at bruge almindelig SQL. Heldigvis tilbyder PostgreSQL vinduesfunktioner til sådan dataanalyse. Sådan får du første række pr. gruppe i PostgreSQL.

Sådan får du første række pr. gruppe i PostgreSQL

Her er trinene til at få første række pr. gruppe i PostgreSQL.

Lad os sige, at du har følgende tabel produktsalg der indeholder produktmæssigt salg.

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

Lad os sige, at du vil have første række i hver gruppe, det vil sige for hvert produkt. Du kan nemt få den første optagelse for hver gruppe ved hjælp af VINDUEFUNKTION.

Bonus Læs:Sådan får du rækkenummer i PostgreSQL

Sådan får du første række pr. gruppe i PostgreSQL

Her er SQL-forespørgslen for at få den første post pr. gruppe. Først tildeler vi rækkenummer for hver post pr. gruppe.

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

I ovenstående forespørgsel bruger vi row_number() funktion til at tildele rækkenummer for hver post. Da vi har brug for separat nummerering af rækker for hver gruppe, bruger vi PARTITION WINDOW FUNCTION. Vi beder Postgresql om at partitionere rækkerne efter hvert produkt , det vil sige, og sorter rækkerne for hver gruppe efter ordre_date

Dernæst skal vi bare bruge ovenstående resultat til at vælge rækker, hvor 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

Ovenstående forespørgsel vil give dig den første post i hver gruppe.

Bonus Læs:Sådan beregnes procent i PostgreSQL

Sådan får du sidste række pr. gruppe i PostgreSQL

Hvis du ønsker at få sidste række pr. gruppe i PostgreSQL, skal du blot ændre sorteringsrækkefølgen i PARTITION-klausulen i ovenstående forespørgsel fra stigende til faldende.

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

Forhåbentlig kan du få første post i hver gruppe i PostgreSQL.

Ubiq gør det nemt at visualisere data på få minutter og overvåge i dashboards i realtid. Prøv det i dag!

  1. SSL-nøglestyring og kryptering af MySQL-data i transit

  2. Oracle ODP.net Managed vs Unmanaged Driver

  3. Skrivning til specifikke skemaer med RPostgreSQL

  4. Hvad er denne operator <=> i MySQL?