-- Контекст: индекс дефицита #1959 (эпик #1953) — «−1.00 везде».
--
-- Прогнозный движок дефицита (compute_demand_supply_forecast) дедуплицирует
-- objective_lots до ПОСЛЕДНЕГО снапшота на каждый ФИЗИЧЕСКИЙ лот
-- (objective_lots — append-per-snapshot, ~2.9× инфляция строк; без дедупа спрос И
-- предложение оба раздуты симметрично → каждая ячейка what_to_build даёт один и тот
-- же ratio → все deficit_index = −1.0). Дедуп делается через
--   SELECT DISTINCT ON (project_name, corpus_name, section, floor, lot_number) …
--   ORDER BY project_name, corpus_name, section, floor, lot_number,
--            snapshot_date DESC, id DESC
-- по квартирам (premise_kind='квартира'). Этот partial index точно совпадает с
-- ключом DISTINCT ON и его направлениями сортировки → планировщик берёт Index-Only
-- Scan + Unique вместо сортировки 1.75M строк (EXPLAIN на prod: Sort исчезает,
-- cost ≈ 122k вместо полной сортировки).
--
-- DESC на snapshot_date/id — чтобы «последний снапшот первым» читался прямо из
-- индекса (DISTINCT ON берёт первую строку каждой группы). premise_kind в WHERE —
-- partial index только по квартирам (единственный сегмент дефицит-расчёта), меньше
-- и плотнее, чем полный.
--
-- Порядок применения: миграция ПЕРВОЙ (deploy first), затем backend-код, который
-- использует DISTINCT ON. Idempotent (CREATE INDEX IF NOT EXISTS) — безопасно при
-- ре-apply. Self-wrapped BEGIN/COMMIT.
BEGIN;

CREATE INDEX IF NOT EXISTS objective_lots_physflat_latest_idx
    ON objective_lots (
        project_name,
        corpus_name,
        section,
        floor,
        lot_number,
        snapshot_date DESC,
        id DESC
    )
    WHERE premise_kind = 'квартира';

COMMIT;
