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

Función de agregación para obtener la diferencia o la proporción de dos filas en orden

Dado que there are only two rows per price , esto puede ser mucho más simple y más rápido:

SELECT n.item, n.price - o.price AS diff, n.price / o.price AS ratio
FROM   price n                 -- "new"
JOIN   price o USING (item)    -- "old"
WHERE  n.day > o.day;

->SQLfiddle

Este formulario tiene el beneficio adicional de que puede usar todas las columnas de ambas filas directamente.

Para escenarios más complejos (no es necesario para esto), podría usar funciones de ventana como se ha señalado. Aquí hay un enfoque más simple que lo que se ha sugerido:

SELECT DISTINCT ON (item)
       item
      ,price - lead(price) OVER (PARTITION BY item ORDER BY day DESC) AS diff
FROM   price
ORDER  BY item, day DESC;

Aquí solo se necesita una función de ventana. Y un nivel de consulta, ya que DISTINCT ON se aplica después funciones de ventana El orden de clasificación en la ventana coincide con el orden de clasificación general, lo que ayuda al rendimiento.