Depuis there are only two rows per price
, cela peut être beaucoup plus simple et plus rapide :
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;
Ce formulaire présente l'avantage supplémentaire que vous pouvez utiliser directement toutes les colonnes des deux lignes.
Pour les scénarios plus complexes (pas nécessaire pour cela), vous pouvez utiliser les fonctions de fenêtre comme cela a été souligné. Voici une approche plus simple que ce qui a été suggéré :
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;
Une seule fonction de fenêtre est nécessaire ici. Et un niveau de requête, puisque DISTINCT ON
est appliqué après fonctions de la fenêtre. L'ordre de tri dans la fenêtre correspond à l'ordre de tri général, ce qui améliore les performances.