Boundary vintages

County and tract boundaries change: counties split, merge, or get replaced entirely. A FIPS code without a vintage is an assembly name without a patch level — the same code can mean a different shape depending on when it was issued.

The worked example: SVI’s own county count

CDC/ATSDR’s Social Vulnerability Index republishes the whole country every edition, so its county count across editions is a direct, queryable record of every boundary change that mattered at the county level between 2014 and 2022:

svi_edition counties
0 2014 3142
1 2016 3142
2 2018 3142
3 2020 3143
4 2022 3144

3,142 / 3,142 / 3,142 / 3,143 / 3,144 — flat for three editions, then +1, then +1 again. Both jumps are real redistrictings, not data errors, and both are queryable directly:

svi_edition rows
0 2014 1
1 2016 1
2 2018 1
3 2020 2
4 2022 2

Alaska’s Valdez-Cordova Census Area (02261) splits into Chugach (02063) and Copper River (02066) starting with the 2020 edition — one row becomes two, the +1 between the 2018 and 2020 counts.

svi_edition rows
0 2014 8
1 2016 8
2 2018 8
3 2020 8
4 2022 9

Connecticut’s eight legacy counties persist through the 2020 edition; the nine 2022-vintage planning regions arrive with the 2022 edition — the +1 between the 2020 and 2022 counts.

The third real change in this window — South Dakota’s Shannon County becoming Oglala Lakota County in 2015 — is a rename-and-recode, not a boundary change, so it doesn’t move the county count at all; it shows up instead as fips changing from 46113 to 46102 starting with the 2016 edition, with the pre-2016 code still resolving through geography.alias:

old_geo_id new_geo_id effective_year change_type old_name new_name
0 county:46113 county:46102 2015 recode_and_rename Shannon County Oglala Lakota County

Why geography.unit carries a vintage at all

Every fact in Cancer Basemap joins through geography.unit by geo_id, but a geo_id alone doesn’t say which boundary edition it belongs to. vintage makes that explicit, and it’s why every recipe on this site names a vintage on its geography join (u.vintage = 2026) instead of trusting a measure’s own geo_vintage column — see Time axes and cancer-basemap#21 for the open question that makes this necessary today. geography.alias resolves an old code that was renamed or recoded (not reshaped) to its current one, so a join on a retired code still finds its record instead of silently dropping it.

Recipes › A county’s boundary history runs Connecticut’s own boundary history live, in your browser.