Sprint 4 implementation: Loaders: - base.py: Session management, bulk insert, upsert utilities - dimensions.py: Load time, district, zone, neighbourhood, policy dimensions - trreb.py: Load TRREB purchase data to fact_purchases - cmhc.py: Load CMHC rental data to fact_rentals dbt Project: - Project configuration (dbt_project.yml, packages.yml) - Staging models for all fact and dimension tables - Intermediate models with dimension enrichment - Marts: purchase analysis, rental analysis, market summary Closes #16 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
65 lines
1.5 KiB
SQL
65 lines
1.5 KiB
SQL
-- Mart: Toronto Rental Market Analysis
|
|
-- Final analytical table for rental market visualization
|
|
-- Grain: One row per zone per bedroom type per survey year
|
|
|
|
with rentals as (
|
|
select * from {{ ref('int_rentals__annual') }}
|
|
),
|
|
|
|
-- Add year-over-year calculations
|
|
with_yoy as (
|
|
select
|
|
r.*,
|
|
|
|
-- Previous year values
|
|
lag(r.avg_rent, 1) over (
|
|
partition by r.zone_code, r.bedroom_type
|
|
order by r.year
|
|
) as avg_rent_prev_year,
|
|
|
|
lag(r.vacancy_rate, 1) over (
|
|
partition by r.zone_code, r.bedroom_type
|
|
order by r.year
|
|
) as vacancy_rate_prev_year
|
|
|
|
from rentals r
|
|
),
|
|
|
|
final as (
|
|
select
|
|
rental_id,
|
|
date_key,
|
|
full_date,
|
|
year,
|
|
quarter,
|
|
zone_key,
|
|
zone_code,
|
|
zone_name,
|
|
bedroom_type,
|
|
rental_universe,
|
|
avg_rent,
|
|
median_rent,
|
|
vacancy_rate,
|
|
availability_rate,
|
|
turnover_rate,
|
|
year_over_year_rent_change,
|
|
reliability_code,
|
|
vacant_units_estimate,
|
|
|
|
-- Calculated year-over-year (if not provided)
|
|
coalesce(
|
|
year_over_year_rent_change,
|
|
case
|
|
when avg_rent_prev_year > 0
|
|
then round(((avg_rent - avg_rent_prev_year) / avg_rent_prev_year) * 100, 2)
|
|
else null
|
|
end
|
|
) as rent_change_pct,
|
|
|
|
vacancy_rate - vacancy_rate_prev_year as vacancy_rate_change
|
|
|
|
from with_yoy
|
|
)
|
|
|
|
select * from final
|