PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Fonction d'agrégation pour obtenir la différence ou le rapport de deux lignes dans l'ordre

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;

->SQLfiddle

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.