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.
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:
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.