@@ -13,149 +13,201 @@ DECLARE operational_emissions_network NUMERIC DEFAULT 0.059;
1313DECLARE operational_emissions_user_devices NUMERIC DEFAULT 0 .080 ;
1414
1515WITH cms_data AS (
16- SELECT
17- client,
18- page,
19- tech .technology AS cms,
20- CAST(JSON_VALUE(summary, ' $.bytesTotal' ) AS INT64) / 1024 AS total_kb,
21-
22- -- Operational emissions calculations
23- (CAST(JSON_VALUE(summary, ' $.bytesTotal' ) AS INT64) / 1024 / 1024 / 1024 ) * operational_emissions_data_centers * grid_intensity AS op_emissions_dc,
24- (CAST(JSON_VALUE(summary, ' $.bytesTotal' ) AS INT64) / 1024 / 1024 / 1024 ) * operational_emissions_network * grid_intensity AS op_emissions_networks,
25- (CAST(JSON_VALUE(summary, ' $.bytesTotal' ) AS INT64) / 1024 / 1024 / 1024 ) * operational_emissions_user_devices * grid_intensity AS op_emissions_devices,
26-
27- -- Embodied emissions calculations
28- (CAST(JSON_VALUE(summary, ' $.bytesTotal' ) AS INT64) / 1024 / 1024 / 1024 ) * embodied_emissions_data_centers * grid_intensity AS em_emissions_dc,
29- (CAST(JSON_VALUE(summary, ' $.bytesTotal' ) AS INT64) / 1024 / 1024 / 1024 ) * embodied_emissions_network * grid_intensity AS em_emissions_networks,
30- (CAST(JSON_VALUE(summary, ' $.bytesTotal' ) AS INT64) / 1024 / 1024 / 1024 ) * embodied_emissions_user_devices * grid_intensity AS em_emissions_devices,
31-
32- -- Total emissions (operational + embodied)
33- (
34- (CAST(JSON_VALUE(summary, ' $.bytesTotal' ) AS INT64) / 1024 / 1024 / 1024 ) * operational_emissions_data_centers * grid_intensity +
35- (CAST(JSON_VALUE(summary, ' $.bytesTotal' ) AS INT64) / 1024 / 1024 / 1024 ) * operational_emissions_network * grid_intensity +
36- (CAST(JSON_VALUE(summary, ' $.bytesTotal' ) AS INT64) / 1024 / 1024 / 1024 ) * operational_emissions_user_devices * grid_intensity
37- ) AS total_operational_emissions,
38-
39- (
40- (CAST(JSON_VALUE(summary, ' $.bytesTotal' ) AS INT64) / 1024 / 1024 / 1024 ) * embodied_emissions_data_centers * grid_intensity +
41- (CAST(JSON_VALUE(summary, ' $.bytesTotal' ) AS INT64) / 1024 / 1024 / 1024 ) * embodied_emissions_network * grid_intensity +
42- (CAST(JSON_VALUE(summary, ' $.bytesTotal' ) AS INT64) / 1024 / 1024 / 1024 ) * embodied_emissions_user_devices * grid_intensity
43- ) AS total_embodied_emissions,
44-
45- (
46- (CAST(JSON_VALUE(summary, ' $.bytesTotal' ) AS INT64) / 1024 / 1024 / 1024 ) * operational_emissions_data_centers * grid_intensity +
47- (CAST(JSON_VALUE(summary, ' $.bytesTotal' ) AS INT64) / 1024 / 1024 / 1024 ) * operational_emissions_network * grid_intensity +
48- (CAST(JSON_VALUE(summary, ' $.bytesTotal' ) AS INT64) / 1024 / 1024 / 1024 ) * operational_emissions_user_devices * grid_intensity +
49- (CAST(JSON_VALUE(summary, ' $.bytesTotal' ) AS INT64) / 1024 / 1024 / 1024 ) * embodied_emissions_data_centers * grid_intensity +
50- (CAST(JSON_VALUE(summary, ' $.bytesTotal' ) AS INT64) / 1024 / 1024 / 1024 ) * embodied_emissions_network * grid_intensity +
51- (CAST(JSON_VALUE(summary, ' $.bytesTotal' ) AS INT64) / 1024 / 1024 / 1024 ) * embodied_emissions_user_devices * grid_intensity
52- ) AS total_emissions,
53-
54- -- Proportions of each resource type relative to total bytes
55- CAST(JSON_VALUE(summary, ' $.bytesHtml' ) AS INT64) / CAST(JSON_VALUE(summary, ' $.bytesTotal' ) AS INT64) AS html_proportion,
56- CAST(JSON_VALUE(summary, ' $.bytesJS' ) AS INT64) / CAST(JSON_VALUE(summary, ' $.bytesTotal' ) AS INT64) AS js_proportion,
57- CAST(JSON_VALUE(summary, ' $.bytesCss' ) AS INT64) / CAST(JSON_VALUE(summary, ' $.bytesTotal' ) AS INT64) AS css_proportion,
58- CAST(JSON_VALUE(summary, ' $.bytesImg' ) AS INT64) / CAST(JSON_VALUE(summary, ' $.bytesTotal' ) AS INT64) AS img_proportion,
59- CAST(JSON_VALUE(summary, ' $.bytesFont' ) AS INT64) / CAST(JSON_VALUE(summary, ' $.bytesTotal' ) AS INT64) AS font_proportion,
60-
61- -- Resource-specific emissions calculations
62- (SAFE_DIVIDE(CAST(JSON_VALUE(summary, ' $.bytesHtml' ) AS INT64), CAST(JSON_VALUE(summary, ' $.bytesTotal' ) AS INT64)) * (
63- (CAST(JSON_VALUE(summary, ' $.bytesTotal' ) AS INT64) / 1024 / 1024 / 1024 ) * (
64- operational_emissions_data_centers * grid_intensity +
65- operational_emissions_network * grid_intensity +
66- operational_emissions_user_devices * grid_intensity +
67- embodied_emissions_data_centers * grid_intensity +
68- embodied_emissions_network * grid_intensity +
69- embodied_emissions_user_devices * grid_intensity
70- )
71- )) AS total_html_emissions,
72-
73- (SAFE_DIVIDE(CAST(JSON_VALUE(summary, ' $.bytesJS' ) AS INT64), CAST(JSON_VALUE(summary, ' $.bytesTotal' ) AS INT64)) * (
74- (CAST(JSON_VALUE(summary, ' $.bytesTotal' ) AS INT64) / 1024 / 1024 / 1024 ) * (
75- operational_emissions_data_centers * grid_intensity +
76- operational_emissions_network * grid_intensity +
77- operational_emissions_user_devices * grid_intensity +
78- embodied_emissions_data_centers * grid_intensity +
79- embodied_emissions_network * grid_intensity +
80- embodied_emissions_user_devices * grid_intensity
81- )
82- )) AS total_js_emissions,
83-
84- (SAFE_DIVIDE(CAST(JSON_VALUE(summary, ' $.bytesCss' ) AS INT64), CAST(JSON_VALUE(summary, ' $.bytesTotal' ) AS INT64)) * (
85- (CAST(JSON_VALUE(summary, ' $.bytesTotal' ) AS INT64) / 1024 / 1024 / 1024 ) * (
86- operational_emissions_data_centers * grid_intensity +
87- operational_emissions_network * grid_intensity +
88- operational_emissions_user_devices * grid_intensity +
89- embodied_emissions_data_centers * grid_intensity +
90- embodied_emissions_network * grid_intensity +
91- embodied_emissions_user_devices * grid_intensity
92- )
93- )) AS total_css_emissions,
94-
95- (SAFE_DIVIDE(CAST(JSON_VALUE(summary, ' $.bytesImg' ) AS INT64), CAST(JSON_VALUE(summary, ' $.bytesTotal' ) AS INT64)) * (
96- (CAST(JSON_VALUE(summary, ' $.bytesTotal' ) AS INT64) / 1024 / 1024 / 1024 ) * (
97- operational_emissions_data_centers * grid_intensity +
98- operational_emissions_network * grid_intensity +
99- operational_emissions_user_devices * grid_intensity +
100- embodied_emissions_data_centers * grid_intensity +
101- embodied_emissions_network * grid_intensity +
102- embodied_emissions_user_devices * grid_intensity
103- )
104- )) AS total_img_emissions,
105-
106- (SAFE_DIVIDE(CAST(JSON_VALUE(summary, ' $.bytesFont' ) AS INT64), CAST(JSON_VALUE(summary, ' $.bytesTotal' ) AS INT64)) * (
107- (CAST(JSON_VALUE(summary, ' $.bytesTotal' ) AS INT64) / 1024 / 1024 / 1024 ) * (
108- operational_emissions_data_centers * grid_intensity +
109- operational_emissions_network * grid_intensity +
110- operational_emissions_user_devices * grid_intensity +
111- embodied_emissions_data_centers * grid_intensity +
112- embodied_emissions_network * grid_intensity +
113- embodied_emissions_user_devices * grid_intensity
114- )
115- )) AS total_font_emissions,
116-
117- -- Resource-specific size in KB
118- CAST(JSON_VALUE(summary, ' $.bytesHtml' ) AS INT64) / 1024 AS html_kb,
119- CAST(JSON_VALUE(summary, ' $.bytesJS' ) AS INT64) / 1024 AS js_kb,
120- CAST(JSON_VALUE(summary, ' $.bytesCss' ) AS INT64) / 1024 AS css_kb,
121- CAST(JSON_VALUE(summary, ' $.bytesImg' ) AS INT64) / 1024 AS img_kb,
122- CAST(JSON_VALUE(summary, ' $.bytesFont' ) AS INT64) / 1024 AS font_kb
123- FROM
124- ` httparchive.crawl.pages` ,
125- UNNEST(technologies) AS tech
126- WHERE
127- date = ' 2025-07-01' AND
128- is_root_page = TRUE AND
129- ' CMS' IN UNNEST(tech .categories )
16+ SELECT
17+ client,
18+ page,
19+ tech .technology AS cms,
20+ INT64(summary .bytestotal ) / 1024 AS total_kb,
21+
22+ -- Operational emissions calculations
23+ (
24+ INT64(summary .bytestotal ) / 1024 / 1024 / 1024
25+ ) * operational_emissions_data_centers * grid_intensity AS op_emissions_dc,
26+ (
27+ INT64(summary .bytestotal ) / 1024 / 1024 / 1024
28+ ) * operational_emissions_network * grid_intensity AS op_emissions_networks,
29+ (
30+ INT64(summary .bytestotal ) / 1024 / 1024 / 1024
31+ ) * operational_emissions_user_devices * grid_intensity AS op_emissions_devices,
32+
33+ -- Embodied emissions calculations
34+ (
35+ INT64(summary .bytestotal ) / 1024 / 1024 / 1024
36+ ) * embodied_emissions_data_centers * grid_intensity AS em_emissions_dc,
37+ (
38+ INT64(summary .bytestotal ) / 1024 / 1024 / 1024
39+ ) * embodied_emissions_network * grid_intensity AS em_emissions_networks,
40+ (
41+ INT64(summary .bytestotal ) / 1024 / 1024 / 1024
42+ ) * embodied_emissions_user_devices * grid_intensity AS em_emissions_devices,
43+
44+ -- Total emissions (operational + embodied)
45+ (
46+ (
47+ INT64(summary .bytestotal ) / 1024 / 1024 / 1024
48+ ) * operational_emissions_data_centers * grid_intensity +
49+ (
50+ INT64(summary .bytestotal ) / 1024 / 1024 / 1024
51+ ) * operational_emissions_network * grid_intensity +
52+ (
53+ INT64(summary .bytestotal ) / 1024 / 1024 / 1024
54+ ) * operational_emissions_user_devices * grid_intensity
55+ ) AS total_operational_emissions,
56+
57+ (
58+ (
59+ INT64(summary .bytestotal ) / 1024 / 1024 / 1024
60+ ) * embodied_emissions_data_centers * grid_intensity +
61+ (
62+ INT64(summary .bytestotal ) / 1024 / 1024 / 1024
63+ ) * embodied_emissions_network * grid_intensity +
64+ (
65+ INT64(summary .bytestotal ) / 1024 / 1024 / 1024
66+ ) * embodied_emissions_user_devices * grid_intensity
67+ ) AS total_embodied_emissions,
68+
69+ (
70+ (
71+ INT64(summary .bytestotal ) / 1024 / 1024 / 1024
72+ ) * operational_emissions_data_centers * grid_intensity +
73+ (
74+ INT64(summary .bytestotal ) / 1024 / 1024 / 1024
75+ ) * operational_emissions_network * grid_intensity +
76+ (
77+ INT64(summary .bytestotal ) / 1024 / 1024 / 1024
78+ ) * operational_emissions_user_devices * grid_intensity +
79+ (
80+ INT64(summary .bytestotal ) / 1024 / 1024 / 1024
81+ ) * embodied_emissions_data_centers * grid_intensity +
82+ (
83+ INT64(summary .bytestotal ) / 1024 / 1024 / 1024
84+ ) * embodied_emissions_network * grid_intensity +
85+ (
86+ INT64(summary .bytestotal ) / 1024 / 1024 / 1024
87+ ) * embodied_emissions_user_devices * grid_intensity
88+ ) AS total_emissions,
89+
90+ -- Proportions of each resource type relative to total bytes
91+ INT64(summary .byteshtml ) / INT64(summary .bytestotal ) AS html_proportion,
92+ INT64(summary .bytesjs ) / INT64(summary .bytestotal ) AS js_proportion,
93+ INT64(summary .bytescss ) / INT64(summary .bytestotal ) AS css_proportion,
94+ INT64(summary .bytesimg ) / INT64(summary .bytestotal ) AS img_proportion,
95+ INT64(summary .bytesfont ) / INT64(summary .bytestotal ) AS font_proportion,
96+
97+ -- Resource-specific emissions calculations
98+ (SAFE_DIVIDE(INT64(summary .byteshtml ), INT64(summary .bytestotal )) * (
99+ (INT64(summary .bytestotal ) / 1024 / 1024 / 1024 ) * (
100+ operational_emissions_data_centers * grid_intensity +
101+ operational_emissions_network * grid_intensity +
102+ operational_emissions_user_devices * grid_intensity +
103+ embodied_emissions_data_centers * grid_intensity +
104+ embodied_emissions_network * grid_intensity +
105+ embodied_emissions_user_devices * grid_intensity
106+ )
107+ )) AS total_html_emissions,
108+
109+ (SAFE_DIVIDE(INT64(summary .bytesjs ), INT64(summary .bytestotal )) * (
110+ (INT64(summary .bytestotal ) / 1024 / 1024 / 1024 ) * (
111+ operational_emissions_data_centers * grid_intensity +
112+ operational_emissions_network * grid_intensity +
113+ operational_emissions_user_devices * grid_intensity +
114+ embodied_emissions_data_centers * grid_intensity +
115+ embodied_emissions_network * grid_intensity +
116+ embodied_emissions_user_devices * grid_intensity
117+ )
118+ )) AS total_js_emissions,
119+
120+ (SAFE_DIVIDE(INT64(summary .bytescss ), INT64(summary .bytestotal )) * (
121+ (INT64(summary .bytestotal ) / 1024 / 1024 / 1024 ) * (
122+ operational_emissions_data_centers * grid_intensity +
123+ operational_emissions_network * grid_intensity +
124+ operational_emissions_user_devices * grid_intensity +
125+ embodied_emissions_data_centers * grid_intensity +
126+ embodied_emissions_network * grid_intensity +
127+ embodied_emissions_user_devices * grid_intensity
128+ )
129+ )) AS total_css_emissions,
130+
131+ (SAFE_DIVIDE(INT64(summary .bytesimg ), INT64(summary .bytestotal )) * (
132+ (INT64(summary .bytestotal ) / 1024 / 1024 / 1024 ) * (
133+ operational_emissions_data_centers * grid_intensity +
134+ operational_emissions_network * grid_intensity +
135+ operational_emissions_user_devices * grid_intensity +
136+ embodied_emissions_data_centers * grid_intensity +
137+ embodied_emissions_network * grid_intensity +
138+ embodied_emissions_user_devices * grid_intensity
139+ )
140+ )) AS total_img_emissions,
141+
142+ (SAFE_DIVIDE(INT64(summary .bytesfont ), INT64(summary .bytestotal )) * (
143+ (INT64(summary .bytestotal ) / 1024 / 1024 / 1024 ) * (
144+ operational_emissions_data_centers * grid_intensity +
145+ operational_emissions_network * grid_intensity +
146+ operational_emissions_user_devices * grid_intensity +
147+ embodied_emissions_data_centers * grid_intensity +
148+ embodied_emissions_network * grid_intensity +
149+ embodied_emissions_user_devices * grid_intensity
150+ )
151+ )) AS total_font_emissions,
152+
153+ -- Resource-specific size in KB
154+ INT64(summary .byteshtml ) / 1024 AS html_kb,
155+ INT64(summary .bytesjs ) / 1024 AS js_kb,
156+ INT64(summary .bytescss ) / 1024 AS css_kb,
157+ INT64(summary .bytesimg ) / 1024 AS img_kb,
158+ INT64(summary .bytesfont ) / 1024 AS font_kb
159+ FROM
160+ ` httparchive.crawl.pages` ,
161+ UNNEST(technologies) AS tech
162+ WHERE
163+ date = ' 2025-07-01' AND
164+ is_root_page = TRUE AND
165+ ' CMS' IN UNNEST(tech .categories )
130166)
131167
132168SELECT
133- client,
134- cms,
135- COUNT (0 ) AS pages,
136- -- Median resource weights and emissions
137- APPROX_QUANTILES(total_kb, 1000 )[OFFSET(500 )] AS median_total_kb,
138- APPROX_QUANTILES(total_operational_emissions, 1000 )[OFFSET(500 )] AS median_operational_emissions,
139- APPROX_QUANTILES(total_embodied_emissions, 1000 )[OFFSET(500 )] AS median_embodied_emissions,
140- APPROX_QUANTILES(total_emissions, 1000 )[OFFSET(500 )] AS median_total_emissions,
141-
142- -- Resource-specific medians
143- APPROX_QUANTILES(html_kb, 1000 )[OFFSET(500 )] AS median_html_kb,
144- APPROX_QUANTILES(total_html_emissions, 1000 )[OFFSET(500 )] AS median_total_html_emissions,
145- APPROX_QUANTILES(js_kb, 1000 )[OFFSET(500 )] AS median_js_kb,
146- APPROX_QUANTILES(total_js_emissions, 1000 )[OFFSET(500 )] AS median_total_js_emissions,
147- APPROX_QUANTILES(css_kb, 1000 )[OFFSET(500 )] AS median_css_kb,
148- APPROX_QUANTILES(total_css_emissions, 1000 )[OFFSET(500 )] AS median_total_css_emissions,
149- APPROX_QUANTILES(img_kb, 1000 )[OFFSET(500 )] AS median_img_kb,
150- APPROX_QUANTILES(total_img_emissions, 1000 )[OFFSET(500 )] AS median_total_img_emissions,
151- APPROX_QUANTILES(font_kb, 1000 )[OFFSET(500 )] AS median_font_kb,
152- APPROX_QUANTILES(total_font_emissions, 1000 )[OFFSET(500 )] AS median_total_font_emissions
169+ client,
170+ cms,
171+ COUNT (* ) AS pages,
172+ -- Median resource weights and emissions
173+ APPROX_QUANTILES(total_kb, 1000 ) [OFFSET(500 )] AS median_total_kb,
174+ APPROX_QUANTILES(
175+ total_operational_emissions, 1000
176+ ) [OFFSET(500 )] AS median_operational_emissions,
177+ APPROX_QUANTILES(
178+ total_embodied_emissions, 1000
179+ ) [OFFSET(500 )] AS median_embodied_emissions,
180+ APPROX_QUANTILES(
181+ total_emissions, 1000
182+ ) [OFFSET(500 )] AS median_total_emissions,
183+
184+ -- Resource-specific medians
185+ APPROX_QUANTILES(html_kb, 1000 ) [OFFSET(500 )] AS median_html_kb,
186+ APPROX_QUANTILES(
187+ total_html_emissions, 1000
188+ ) [OFFSET(500 )] AS median_total_html_emissions,
189+ APPROX_QUANTILES(js_kb, 1000 ) [OFFSET(500 )] AS median_js_kb,
190+ APPROX_QUANTILES(
191+ total_js_emissions, 1000
192+ ) [OFFSET(500 )] AS median_total_js_emissions,
193+ APPROX_QUANTILES(css_kb, 1000 ) [OFFSET(500 )] AS median_css_kb,
194+ APPROX_QUANTILES(
195+ total_css_emissions, 1000
196+ ) [OFFSET(500 )] AS median_total_css_emissions,
197+ APPROX_QUANTILES(img_kb, 1000 ) [OFFSET(500 )] AS median_img_kb,
198+ APPROX_QUANTILES(
199+ total_img_emissions, 1000
200+ ) [OFFSET(500 )] AS median_total_img_emissions,
201+ APPROX_QUANTILES(font_kb, 1000 ) [OFFSET(500 )] AS median_font_kb,
202+ APPROX_QUANTILES(
203+ total_font_emissions, 1000
204+ ) [OFFSET(500 )] AS median_total_font_emissions
153205FROM
154- cms_data
206+ cms_data
155207GROUP BY
156- client,
157- cms
208+ client,
209+ cms
158210ORDER BY
159- pages DESC ,
160- cms,
161- client;
211+ pages DESC ,
212+ cms ASC ,
213+ client ASC ;
0 commit comments