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!