Bạn đã nhóm của bạn xuống đến phút. Điều mà tôi sẽ cho là sai vì chúng thường được thực hiện theo ngày. Nếu tôi sai, bạn sẽ phải đổi lại.
SELECT DISTINCT contract_id, ts::date,
min(price) OVER w,
max(price) OVER w,
first_value(price) OVER w,
last_value(price) OVER w
FROM fill
WINDOW w AS (PARTITION BY contract_id, ts::date ORDER BY ts)
ORDER BY 1,2