sql >> Base de Datos >  >> RDS >> PostgreSQL

Cómo obtener la primera fila por grupo en PostgreSQL

A veces, es posible que deba obtener la primera fila por grupo en PostgreSQL. Esta puede ser una consulta difícil usando SQL simple. Afortunadamente, PostgreSQL ofrece funciones de ventana para este tipo de análisis de datos. Aquí se explica cómo obtener la primera fila por grupo en PostgreSQL.

Cómo obtener la primera fila por grupo en PostgreSQL

Estos son los pasos para obtener la primera fila por grupo en PostgreSQL.

Supongamos que tiene la siguiente tabla product_sales que contiene ventas por productos.

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 desea obtener la primera fila en cada grupo, es decir, para cada producto. Puede obtener fácilmente el primer registro de cada grupo utilizando la FUNCIÓN DE VENTANA.

Lectura adicional:cómo obtener el número de fila en PostgreSQL

Cómo obtener la primera fila por grupo en PostgreSQL

Aquí está la consulta SQL para obtener el primer registro por grupo. Primero asignamos un número de fila 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

En la consulta anterior, usamos row_number() función para asignar el número de fila para cada registro. Dado que necesitamos una numeración separada de filas para cada grupo, usamos la FUNCIÓN DE VENTANA DE PARTICIÓN. Le decimos a Postgresql que divida las filas por cada producto , es decir, y ordenar las filas de cada grupo por order_date

A continuación, solo necesitamos usar el resultado anterior para seleccionar filas donde número_fila=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 consulta anterior le dará el primer registro de cada grupo.

Lectura adicional:Cómo calcular el percentil en PostgreSQL

Cómo obtener la última fila por grupo en PostgreSQL

Si desea obtener la última fila por grupo en PostgreSQL, simplemente cambie el orden de clasificación en la cláusula PARTITION de la consulta anterior de ascendente a 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

Con suerte, puede obtener el primer registro en cada grupo en PostgreSQL.

Ubiq facilita la visualización de datos en minutos y la supervisión en paneles en tiempo real. ¡Pruébalo hoy!