PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Como obter a primeira linha por grupo no PostgreSQL


Às vezes, você pode precisar obter a primeira linha por grupo no PostgreSQL. Esta pode ser uma consulta difícil usando SQL simples. Felizmente, o PostgreSQL oferece funções de janela para tal análise de dados. Veja como obter a primeira linha por grupo no PostgreSQL.


Como obter a primeira linha por grupo no PostgreSQL


Aqui estão as etapas para obter a primeira linha por grupo no PostgreSQL.

Digamos que você tenha a seguinte tabela product_sales que contém vendas por produto.
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



Digamos que você queira obter a primeira linha em cada grupo, ou seja, para cada produto. Você pode facilmente obter o primeiro registro para cada grupo usando WINDOW FUNCTION.

Bônus de leitura:Como obter o número da linha no PostgreSQL


Como obter a primeira linha por grupo no PostgreSQL


Aqui está a consulta SQL para obter o primeiro registro por grupo. Primeiro, atribuímos o número da linha para cada registro por grupo.
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

Na consulta acima, usamos row_number() função para atribuir o número da linha para cada registro. Como precisamos de numeração separada de linhas para cada grupo, usamos PARTITION WINDOW FUNCTION. Dizemos ao Postgresql para Particionar as linhas por cada produto , ou seja, e classifique as linhas de cada grupo por order_date

Em seguida, só precisamos usar o resultado acima para selecionar linhas onde 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

A consulta acima lhe dará o primeiro registro em cada grupo.

Bônus de leitura:Como calcular o percentil no PostgreSQL


Como obter a última linha por grupo no PostgreSQL


Se você deseja obter a última linha por grupo no PostgreSQL, basta alterar a ordem de classificação na cláusula PARTITION da consulta acima de ascendente para descendente.
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



Felizmente, você pode obter o primeiro registro em cada grupo no PostgreSQL.

A Ubiq facilita a visualização de dados em minutos e o monitoramento em painéis em tempo real. Experimente hoje!