gendesign/data/sql/107_backfill_price_per_m2.sql
lekss361 d3ce5a2f96 fix(sf-16): derive price_per_m2 from price_rub in _norm_flat + backfill SQL
Audit confirmed: DOM.RF /portal/table API returns price=null for 99.7% of flats
(both price_rub and price_per_m2 are NULL). Root cause is API limitation — per-flat
pricing lives in a separate catalog endpoint not yet scraped (BUG #22).

Adds defensive fallback in _norm_flat(): when price_rub is present but
pricePerSquareMeter is absent, derive price_per_m2 = round(price_rub / total_area, 2).
Covers partial API responses from any future endpoint that omits the computed rate.

Adds 107_backfill_price_per_m2.sql for historical rows (~849 affected).
2026-05-17 17:27:12 +03:00

24 lines
930 B
PL/PgSQL

-- 107_backfill_price_per_m2.sql
-- Backfill price_per_m2 = ROUND(price_rub / total_area, 2) for rows where
-- price_rub is known but price_per_m2 was not stored by the scraper.
--
-- Context (SF FixList #16):
-- domrf_kn.py _norm_flat() now derives price_per_m2 on ingest.
-- This one-time UPDATE covers historical rows scraped before the fix.
-- For Малевич (obj_id=64701) and the wider dataset, both price_rub AND
-- price_per_m2 are NULL (DOM.RF /portal/table API does not return per-flat
-- pricing for most objects). Those rows are unaffected by this UPDATE.
-- Only rows where price_rub IS NOT NULL benefit — currently ~849 rows.
--
-- Safe to re-run: idempotent (WHERE price_per_m2 IS NULL).
BEGIN;
UPDATE domrf_kn_flats
SET price_per_m2 = ROUND((price_rub / total_area)::numeric, 2)
WHERE price_per_m2 IS NULL
AND price_rub IS NOT NULL
AND total_area IS NOT NULL
AND total_area > 0;
COMMIT;