sql >> Database >  >> RDS >> PostgreSQL

Hoe u de eerste rij per groep kunt krijgen in PostgreSQL

Soms moet u in PostgreSQL de eerste rij per groep krijgen. Dit kan een moeilijke query zijn met gewone SQL. Gelukkig biedt PostgreSQL vensterfuncties voor dergelijke gegevensanalyses. Hier leest u hoe u de eerste rij per groep kunt krijgen in PostgreSQL.

Hoe krijg ik de eerste rij per groep in PostgreSQL

Dit zijn de stappen om de eerste rij per groep in PostgreSQL te krijgen.

Stel dat u de volgende tabel product_sales . heeft die productgewijze verkopen bevat.

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

Stel dat u de eerste rij in elke groep wilt krijgen, dat wil zeggen voor elk product. U kunt gemakkelijk het eerste record voor elke groep krijgen met behulp van de VENSTERFUNCTIE.

Bonus lezen:rijnummer krijgen in PostgreSQL

Hoe krijg ik de eerste rij per groep in PostgreSQL

Hier is de SQL-query om het eerste record per groep te krijgen. Eerst wijzen we voor elk record per groep een rijnummer toe.

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

In de bovenstaande zoekopdracht gebruiken we row_number() functie om rijnummers toe te wijzen aan elk record. Omdat we voor elke groep een aparte nummering van de rijen nodig hebben, gebruiken we de FUNCTIE VAN HET VENSTER PARTITIE. We vertellen Postgresql om de rijen te partitioneren op elk product , dat wil zeggen, en sorteer de rijen voor elke groep op order_date

Vervolgens hoeven we alleen het bovenstaande resultaat te gebruiken om rijen te selecteren waar 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

De bovenstaande zoekopdracht geeft u het eerste record in elke groep.

Bonus lezen:Percentiel berekenen in PostgreSQL

Hoe de laatste rij per groep in PostgreSQL te krijgen

Als u de laatste rij per groep in PostgreSQL wilt hebben, wijzigt u eenvoudig de sorteervolgorde in de PARTITION-clausule van de bovenstaande zoekopdracht van oplopend naar aflopend.

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

Hopelijk kun je het eerste record in elke groep krijgen in PostgreSQL.

Ubiq maakt het gemakkelijk om gegevens binnen enkele minuten te visualiseren en in realtime dashboards te controleren. Probeer het vandaag nog!

  1. HTML-tags verwijderen in PostgreSQL

  2. Grondbeginselen van tabeluitdrukkingen, deel 11 - Aanzichten, overwegingen bij wijzigingen

  3. Heroku Postgres:psql:FATAL:geen pg_hba.conf invoer voor host

  4. Azure-automatiseringsmethoden