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

Come ottenere la prima riga per gruppo in PostgreSQL

A volte, potrebbe essere necessario ottenere la prima riga per gruppo in PostgreSQL. Questa può essere una query difficile utilizzando un semplice SQL. Fortunatamente, PostgreSQL offre funzioni di finestra per tale analisi dei dati. Ecco come ottenere la prima riga per gruppo in PostgreSQL.

Come ottenere la prima riga per gruppo in PostgreSQL

Ecco i passaggi per ottenere la prima riga per gruppo in PostgreSQL.

Supponiamo che tu abbia la seguente tabella product_sales che contiene vendite per prodotto.

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

Diciamo che vuoi ottenere la prima riga in ogni gruppo, cioè per ogni prodotto. Puoi facilmente ottenere il primo record per ogni gruppo utilizzando FUNZIONE FINESTRA.

Bonus Lettura:come ottenere il numero di riga in PostgreSQL

Come ottenere la prima riga per gruppo in PostgreSQL

Ecco la query SQL per ottenere il primo record per gruppo. Per prima cosa assegniamo il numero di riga per ogni record per gruppo.

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

Nella query precedente, utilizziamo row_number() funzione per assegnare il numero di riga per ogni record. Poiché abbiamo bisogno di una numerazione separata delle righe per ogni gruppo, utilizziamo la FUNZIONE FINESTRA DI PARTIZIONE. Diciamo a Postgresql di partizionare le righe per ogni prodotto , ovvero, e ordina le righe per ciascun gruppo per data_ordine

Successivamente, dobbiamo solo utilizzare il risultato sopra per selezionare le righe in cui 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

La query precedente ti darà il primo record in ogni gruppo.

Bonus Leggi:Come calcolare il percentile in PostgreSQL

Come ottenere l'ultima riga per gruppo in PostgreSQL

Se vuoi ottenere l'ultima riga per gruppo in PostgreSQL, cambia semplicemente l'ordinamento nella clausola PARTITION della query precedente da crescente a decrescente.

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

Si spera che tu possa ottenere il primo record in ogni gruppo in PostgreSQL.

Ubiq semplifica la visualizzazione dei dati in pochi minuti e il monitoraggio in dashboard in tempo reale. Provalo oggi!