feat(sql): sales-tracker velocity + absorption MVs for Site Finder (#61) #1711

Merged
lekss361 merged 2 commits from feat/velocity-mv-61 into main 2026-06-17 19:43:15 +00:00
Owner

Задача (#61)

Velocity MV для Site Finder scoring + recommend_mix. B2-1 данные подтверждены: objective_lots 1.1M строк (35 районов, sales_start_date 99%), objective_lots_history 974k.

Решение

Миграция 161_mv_sales_tracker_velocity_absorption.sql:

  • mv_sales_tracker_velocity_by_district — per (district, month): total/sold/sold_share/avg_price (дедуп до последнего snapshot/мес). UNIQUE(district, sale_month) → CONCURRENTLY-ready.
  • mv_sales_tracker_absorption_curves — per (rooms, area_bucket, months_since_start): cum_sold_pct, anchored на sales_start_date (не зависит от sparsity snapshot'ов).
  • refresh-helper, Celery task, beat mv-sales-tracker-refresh-weekly (Mon 04:30 МСК).

Verify (live)

Refresh CONCURRENTLY: velocity 3.4s + absorption 2.6s (<60s budget). Sanity: Академический sold_share 0.65@115.7k, Широкая Речка 0.80@92k, absorption 1к-30-45м² монотонна 3.2%→26.2%@6мес→42.5%@12мес. ruff clean.

⚠️ Номер миграции 161 совпадает с #1650 (другой файл, независимо). absorption использует all-city (96% ЕКБ) — EKB-only фильтр = однострочный follow-up если нужно.

Closes #61

## Задача (#61) Velocity MV для Site Finder scoring + recommend_mix. B2-1 данные подтверждены: `objective_lots` 1.1M строк (35 районов, sales_start_date 99%), `objective_lots_history` 974k. ## Решение Миграция `161_mv_sales_tracker_velocity_absorption.sql`: - `mv_sales_tracker_velocity_by_district` — per (district, month): total/sold/sold_share/avg_price (дедуп до последнего snapshot/мес). UNIQUE(district, sale_month) → CONCURRENTLY-ready. - `mv_sales_tracker_absorption_curves` — per (rooms, area_bucket, months_since_start): cum_sold_pct, anchored на sales_start_date (не зависит от sparsity snapshot'ов). + refresh-helper, Celery task, beat `mv-sales-tracker-refresh-weekly` (Mon 04:30 МСК). ## Verify (live) Refresh CONCURRENTLY: velocity 3.4s + absorption 2.6s (<60s budget). Sanity: Академический sold_share 0.65@115.7k, Широкая Речка 0.80@92k, absorption 1к-30-45м² монотонна 3.2%→26.2%@6мес→42.5%@12мес. `ruff` clean. ⚠️ Номер миграции `161` совпадает с #1650 (другой файл, независимо). absorption использует all-city (96% ЕКБ) — EKB-only фильтр = однострочный follow-up если нужно. Closes #61
lekss361 added 1 commit 2026-06-17 18:51:10 +00:00
feat(sql): sales-tracker velocity + absorption MVs for Site Finder (#61)
Some checks failed
CI / changes (push) Successful in 7s
CI / changes (pull_request) Successful in 9s
CI / frontend-tests (push) Has been skipped
CI / openapi-codegen-check (push) Failing after 1m43s
CI / frontend-tests (pull_request) Has been cancelled
CI / openapi-codegen-check (pull_request) Has been cancelled
CI / backend-tests (push) Failing after 8m50s
CI / backend-tests (pull_request) Failing after 8m43s
96a9c575b4
bot-backend added 1 commit 2026-06-17 19:36:49 +00:00
chore(sql): renumber sales-tracker MV migration 161→164 (avoid collision)
Some checks failed
CI / changes (push) Successful in 9s
CI / changes (pull_request) Successful in 7s
CI / frontend-tests (push) Has been skipped
CI / openapi-codegen-check (push) Failing after 1m49s
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Failing after 1m39s
CI / backend-tests (push) Failing after 8m57s
CI / backend-tests (pull_request) Failing after 9m6s
2cf6261005
lekss361 merged commit 81e708b953 into main 2026-06-17 19:43:15 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#1711
No description provided.