Vì there are only two rows per price
, điều này có thể nhiều đơn giản hơn và nhanh hơn:
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;
Biểu mẫu này mang lại lợi ích bổ sung, đó là bạn có thể sử dụng trực tiếp tất cả các cột từ cả hai hàng.
Đối với các tình huống phức tạp hơn (không cần thiết cho việc này), bạn có thể sử dụng các chức năng cửa sổ như đã được chỉ ra. Đây là một cách tiếp cận đơn giản hơn những gì đã được đề xuất:
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;
Ở đây chỉ cần một chức năng cửa sổ. Và một cấp truy vấn, vì DISTINCT ON
được áp dụng sau các chức năng cửa sổ. Thứ tự sắp xếp trong cửa sổ phù hợp với thứ tự sắp xếp tổng thể, giúp tăng hiệu suất.