-- Flyway V2: Ensure weather_data upsert works by providing a unique index -- Some rows may have been inserted without a uniqueness constraint; de-duplicate first, -- keeping the most recently created record per (property_id, date) -- Remove duplicates (keep latest created_at, then highest id) WITH ranked AS ( SELECT ctid, ROW_NUMBER() OVER ( PARTITION BY property_id, date ORDER BY created_at DESC, id DESC ) AS rn FROM weather_data ), to_delete AS ( SELECT ctid FROM ranked WHERE rn > 1 ) DELETE FROM weather_data w USING to_delete d WHERE w.ctid = d.ctid; -- Now add the uniqueness guarantee CREATE UNIQUE INDEX IF NOT EXISTS ux_weather_data_property_date ON weather_data(property_id, date);