there are only two rows per price
、これは多くになる可能性があります よりシンプルで高速:
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;
このフォームには、両方の行のすべての列を直接使用できるという追加の利点があります。
より複雑なシナリオの場合 (これには必要ありません)、指摘されているようにウィンドウ関数を使用できます。提案されているものよりも簡単なアプローチは次のとおりです。
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;
ここで必要なウィンドウ関数は1つだけです。 DISTINCT ON
後に適用されます ウィンドウ関数。ウィンドウ内の並べ替え順序は全体的な並べ替え順序と一致し、パフォーマンスを向上させます。