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!