Sie haben Ihre auf die Minute genau gruppiert. Ich gehe davon aus, dass das falsch ist, da diese normalerweise tagsüber durchgeführt werden. Wenn ich falsch liege, müssen Sie es wieder ändern.
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