Du har dine grupperet ned til minuttet. Hvilket jeg vil antage er forkert, fordi disse typisk udføres om dagen. Hvis jeg tager fejl, bliver du nødt til at ændre det igen.
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