À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!