Create neighbourhood-centric dbt transformation layer: Staging (5 models): - stg_toronto__neighbourhoods - Neighbourhood dimension - stg_toronto__census - Census demographics - stg_toronto__crime - Crime statistics - stg_toronto__amenities - Amenity counts - stg_cmhc__zone_crosswalk - Zone-to-neighbourhood weights Intermediate (5 models): - int_neighbourhood__demographics - Combined census with quintiles - int_neighbourhood__housing - Housing + affordability indicators - int_neighbourhood__crime_summary - Aggregated crime with YoY - int_neighbourhood__amenity_scores - Per-capita amenity metrics - int_rentals__neighbourhood_allocated - CMHC via area weights Marts (5 models): - mart_neighbourhood_overview - Composite livability score - mart_neighbourhood_housing - Affordability index - mart_neighbourhood_safety - Crime rates per 100K - mart_neighbourhood_demographics - Income/age indices - mart_neighbourhood_amenities - Amenity index Closes #60, #61, #62, #63 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
57 lines
1.6 KiB
SQL
57 lines
1.6 KiB
SQL
-- Intermediate: Housing indicators by neighbourhood
|
|
-- Combines census housing data with allocated CMHC rental data
|
|
-- Grain: One row per neighbourhood per year
|
|
|
|
with neighbourhoods as (
|
|
select * from {{ ref('stg_toronto__neighbourhoods') }}
|
|
),
|
|
|
|
census as (
|
|
select * from {{ ref('stg_toronto__census') }}
|
|
),
|
|
|
|
allocated_rentals as (
|
|
select * from {{ ref('int_rentals__neighbourhood_allocated') }}
|
|
),
|
|
|
|
housing as (
|
|
select
|
|
n.neighbourhood_id,
|
|
n.neighbourhood_name,
|
|
n.geometry,
|
|
|
|
coalesce(r.year, c.census_year) as year,
|
|
|
|
-- Census housing metrics
|
|
c.pct_owner_occupied,
|
|
c.pct_renter_occupied,
|
|
c.average_dwelling_value,
|
|
c.median_household_income,
|
|
|
|
-- Allocated rental metrics (weighted average from CMHC zones)
|
|
r.avg_rent_2bed,
|
|
r.vacancy_rate,
|
|
|
|
-- Affordability calculations
|
|
case
|
|
when c.median_household_income > 0 and r.avg_rent_2bed > 0
|
|
then round((r.avg_rent_2bed * 12 / c.median_household_income) * 100, 2)
|
|
else null
|
|
end as rent_to_income_pct,
|
|
|
|
-- Affordability threshold (30% of income)
|
|
case
|
|
when c.median_household_income > 0 and r.avg_rent_2bed > 0
|
|
then r.avg_rent_2bed * 12 <= c.median_household_income * 0.30
|
|
else null
|
|
end as is_affordable
|
|
|
|
from neighbourhoods n
|
|
left join census c on n.neighbourhood_id = c.neighbourhood_id
|
|
left join allocated_rentals r
|
|
on n.neighbourhood_id = r.neighbourhood_id
|
|
and r.year = c.census_year
|
|
)
|
|
|
|
select * from housing
|