es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Seleccionar el valor por la fecha máxima.

Tengo una tabla en una base de datos PostgreSQL con datos como estos:

id customer_id item value timestamp
1 001 precio 1000 11/1/2021
2 001 precio 1500 11/2/2021
3 001 condición buena 11/3/2021
4 002 condición mala 11/4/2021
5 002 condición buena 11/5/2021
6 002 precio 1000 11/6/2021
7 001 condición buena 11/7/2021
8 001 precio 1400 11/8/2021
9 002 precio 1500 11/9/2021
10 001 condición ok 11/10/2021
11 002 precio 1600 11/11/2021
12 002 precio 1550 11/12/2021

A partir de esta tabla, quiero consultar el último valor por fecha y convertirlo en una tabla como la siguiente:

customer_id precio condición
001 1400 ok
002 1550 buena

Para obtener este tipo de tabla, probé con la siguiente consulta, pero no funcionó bien cuando hay demasiados datos. (Operaciones como Min y Max para texto y números)

Probé esto en pgAdmin 4:

SELECT customer_id,
MAX (Case WHEN item=’precio’ THEN valor END) precio,
MAX (Case WHEN item=’condición’ THEN valor END) condición

DESDE table_name GROUP BY customer_id

Quiero consultar el valor por los datos actualizados más recientes.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para consultar el valor más reciente por fecha, podemos modificar la consulta anterior agregando una subconsulta que recupere la última marca de tiempo para cada combinación de customer_id e item y, posteriormente, unirla con la tabla original para obtener el valor correspondiente:

    SELECT t.customer_id, t_price.value AS precio, t_condition.value AS condición
    FROM (
      SELECT customer_id, item, MAX(timestamp) AS ultimaMarcaDeTiempo
      FROM nombreTabla
      GROUP BY customer_id, item
    ) subconsulta
    JOIN nombreTabla t_price
      ON t_price.customer_id = subconsulta.customer_id
      AND t_price.item = 'precio'
      AND t_price.timestamp = subconsulta.ultimaMarcaDeTiempo
    LEFT JOIN nombreTabla t_condition
      ON t_condition.customer_id = subconsulta.customer_id
      AND t_condition.item = 'condición'
      AND t_condition.timestamp = subconsulta.ultimaMarcaDeTiempo
    GROUP BY t.customer_id, t_price.value, t_condition.value;
    

    En esta consulta, primero creamos una subconsulta que recupera la última marca de tiempo para cada combinación de customer_id e item. Utilizamos la función MAX para obtener la última marca de tiempo para cada grupo, agrupándolo por customer_id e item para obtener la última marca de tiempo para cada combinación de customer_id e item.

    Luego, unimos la tabla original con la subconsulta para obtener el valor para cada combinación de customer_id e item que coincide con la última marca de tiempo. Usamos una unión interna para el item ‘precio’ ya que queremos que esté siempre presente en la salida, pero una unión izquierda para el item ‘condición’, ya que puede que no exista para todos los clientes y aún queremos incluir a esos clientes en la salida.

    Finalmente, agrupamos la salida por customer_id, precio y condición para asegurarnos de obtener solo una fila por customer_id con los valores más recientes.

Comments are closed.