sql >> Databasteknik >  >> RDS >> PostgreSQL

Hur man får första raden per grupp i PostgreSQL

Ibland kan du behöva få första raden per grupp i PostgreSQL. Detta kan vara en svår fråga med vanlig SQL. Lyckligtvis erbjuder PostgreSQL fönsterfunktioner för sådan dataanalys. Så här får du första raden per grupp i PostgreSQL.

Hur får du första raden per grupp i PostgreSQL

Här är stegen för att få första raden per grupp i PostgreSQL.

Låt oss säga att du har följande tabell produktförsäljning som innehåller produktmässig försäljning.

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

Låt oss säga att du vill få första raden i varje grupp, det vill säga för varje produkt. Du kan enkelt få första posten för varje grupp med FÖNSTERFUNKTION.

Bonus Läs:Hur man får radnummer i PostgreSQL

Hur får du första raden per grupp i PostgreSQL

Här är SQL-frågan för att få första posten per grupp. Först tilldelar vi radnummer för varje post per grupp.

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 ovanstående fråga använder vi row_number() funktion för att tilldela radnummer för varje post. Eftersom vi behöver separat numrering av rader för varje grupp, använder vi PARTITION WINDOW FUNCTION. Vi säger åt Postgresql att partitionera raderna efter varje produkt , det vill säga, och sortera raderna för varje grupp efter order_date

Därefter behöver vi bara använda resultatet ovan för att välja rader där 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

Ovanstående fråga ger dig den första posten i varje grupp.

Bonus Läs:Hur man beräknar procent i PostgreSQL

Hur får du sista raden per grupp i PostgreSQL

Om du vill få den sista raden per grupp i PostgreSQL, ändra helt enkelt sorteringsordningen i PARTITION-satsen i ovanstående fråga från stigande till fallande.

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

Förhoppningsvis kan du få första posten i varje grupp i PostgreSQL.

Ubiq gör det enkelt att visualisera data på några minuter och övervaka i realtidsinstrumentpaneler. Prova det idag!

  1. Hur du kontrollerar din SQL Server-version

  2. Databasbelastningsbalansering i molnet - MySQL Master Failover med ProxySQL 2.0:Part One (Deployment)

  3. Samla in prestandadata med verktyget SQLDiag | Felsökning av SQL Server-prestanda -6

  4. Tar bort objekt från ListView och Database med OnItemClickListener