-
Notifications
You must be signed in to change notification settings - Fork 7
Expand file tree
/
Copy pathbq064.sql
More file actions
56 lines (56 loc) · 1.49 KB
/
bq064.sql
File metadata and controls
56 lines (56 loc) · 1.49 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
WITH tract_data AS (
SELECT
c.geo_id,
c.total_pop,
c.income_per_capita,
g.tract_geom
FROM `bigquery-public-data.census_bureau_acs.censustract_2017_5yr` c
JOIN `bigquery-public-data.geo_census_tracts.us_census_tracts_national` g
ON c.geo_id = g.geo_id
),
zip_data AS (
SELECT
zip_code,
zip_code_geom
FROM `bigquery-public-data.geo_us_boundaries.zip_codes`
WHERE ST_DWITHIN(
zip_code_geom,
ST_GEOGPOINT(-122.191667, 47.685833),
8046.72
)
),
tract_zip_intersections AS (
SELECT
t.geo_id,
t.total_pop,
t.income_per_capita,
z.zip_code,
ST_AREA(t.tract_geom) AS tract_area,
ST_AREA(ST_INTERSECTION(t.tract_geom, z.zip_code_geom)) AS intersection_area
FROM tract_data t
JOIN zip_data z ON ST_INTERSECTS(t.tract_geom, z.zip_code_geom)
WHERE ST_AREA(t.tract_geom) > 0
),
allocated_data AS (
SELECT
zip_code,
total_pop * (intersection_area / tract_area) AS allocated_population,
income_per_capita * total_pop * (intersection_area / tract_area) AS allocated_income
FROM tract_zip_intersections
WHERE tract_area > 0
),
zip_totals AS (
SELECT
zip_code,
SUM(allocated_population) AS total_population,
SUM(allocated_income) AS total_income
FROM allocated_data
GROUP BY zip_code
HAVING SUM(allocated_population) > 0
)
SELECT
zip_code,
ROUND(total_population, 1) AS total_population,
ROUND(total_income / total_population, 1) AS average_individual_income
FROM zip_totals
ORDER BY average_individual_income DESC