@@ -42,13 +42,13 @@ const results = []
4242for (const category of Object.keys(lighthouse?.categories ? lighthouse.categories : {})) {
4343 for (const audit of lighthouse.categories[category].auditRefs) {
4444 if (
45- lighthouse.audits[audit.id].score === 1 &&
46- !['metrics', 'hidden'].includes(audit.group)
45+ lighthouse.audits[audit.id].score === 1 // Only include audits that passed
46+ && !['metrics', 'hidden'].includes(audit.group) // Exclude metrics and hidden audits
4747 ) {
4848 results.push({
4949 category,
5050 id: audit.id
51- })
51+ });
5252 }
5353 }
5454}
@@ -70,7 +70,7 @@ WITH pages AS (
7070 ${ constants . devRankFilter }
7171),
7272
73- geo_summary AS (
73+ crux_base AS (
7474 SELECT
7575 \`chrome-ux-report\`.experimental.GET_COUNTRY(country_code) AS geo,
7676 rank,
@@ -135,43 +135,64 @@ geo_summary AS (
135135crux AS (
136136 SELECT
137137 geo,
138- CASE _rank
139- WHEN 100000000 THEN 'ALL'
140- WHEN 10000000 THEN 'Top 10M'
141- WHEN 1000000 THEN 'Top 1M'
142- WHEN 100000 THEN 'Top 100k'
143- WHEN 10000 THEN 'Top 10k'
144- WHEN 1000 THEN 'Top 1k'
145- END AS rank,
146- CONCAT(origin, '/') AS root_page,
147- IF(device = 'desktop', 'desktop', 'mobile') AS client,
138+ rank,
139+ root_page,
140+ client,
141+
142+ any_fid,
143+ good_fid,
144+ any_cls,
145+ good_cls,
146+ any_lcp,
147+ good_lcp,
148+ good_cwv,
149+
150+ any_fcp,
151+ good_fcp,
152+ any_ttfb,
153+ good_ttfb,
154+ any_inp,
155+ good_inp
156+ FROM (
157+ SELECT
158+ geo,
159+ CASE
160+ WHEN rank <= 1000 THEN ['Top 1k', 'Top 10k', 'Top 100k', 'Top 1M', 'Top 10M', 'ALL']
161+ WHEN rank <= 10000 THEN ['Top 10k', 'Top 100k', 'Top 1M', 'Top 10M', 'ALL']
162+ WHEN rank <= 100000 THEN ['Top 100k', 'Top 1M', 'Top 10M', 'ALL']
163+ WHEN rank <= 1000000 THEN ['Top 1M', 'Top 10M', 'ALL']
164+ WHEN rank <= 10000000 THEN ['Top 10M', 'ALL']
165+ ELSE ['ALL']
166+ END AS eligible_ranks,
167+ CONCAT(origin, '/') AS root_page,
168+ IF(device = 'desktop', 'desktop', 'mobile') AS client,
148169
149- # CWV
150- IS_NON_ZERO(fast_fid, avg_fid, slow_fid) AS any_fid,
151- IS_GOOD(fast_fid, avg_fid, slow_fid) AS good_fid,
152- IS_NON_ZERO(small_cls, medium_cls, large_cls) AS any_cls,
153- IS_GOOD(small_cls, medium_cls, large_cls) AS good_cls,
154- IS_NON_ZERO(fast_lcp, avg_lcp, slow_lcp) AS any_lcp,
155- IS_GOOD(fast_lcp, avg_lcp, slow_lcp) AS good_lcp,
156- IF('${ pastMonth } ' < '2024-01-01',
157- (IS_GOOD(fast_fid, avg_fid, slow_fid) OR fast_fid IS NULL) AND
158- IS_GOOD(small_cls, medium_cls, large_cls) AND
159- IS_GOOD(fast_lcp, avg_lcp, slow_lcp),
160- (IS_GOOD(fast_inp, avg_inp, slow_inp) OR fast_inp IS NULL) AND
161- IS_GOOD(small_cls, medium_cls, large_cls) AND
162- IS_GOOD(fast_lcp, avg_lcp, slow_lcp)
163- ) AS good_cwv,
170+ # CWV
171+ IS_NON_ZERO(fast_fid, avg_fid, slow_fid) AS any_fid,
172+ IS_GOOD(fast_fid, avg_fid, slow_fid) AS good_fid,
173+ IS_NON_ZERO(small_cls, medium_cls, large_cls) AS any_cls,
174+ IS_GOOD(small_cls, medium_cls, large_cls) AS good_cls,
175+ IS_NON_ZERO(fast_lcp, avg_lcp, slow_lcp) AS any_lcp,
176+ IS_GOOD(fast_lcp, avg_lcp, slow_lcp) AS good_lcp,
177+ IF('${ pastMonth } ' < '2024-01-01',
178+ (IS_GOOD(fast_fid, avg_fid, slow_fid) OR fast_fid IS NULL) AND
179+ IS_GOOD(small_cls, medium_cls, large_cls) AND
180+ IS_GOOD(fast_lcp, avg_lcp, slow_lcp),
181+ (IS_GOOD(fast_inp, avg_inp, slow_inp) OR fast_inp IS NULL) AND
182+ IS_GOOD(small_cls, medium_cls, large_cls) AND
183+ IS_GOOD(fast_lcp, avg_lcp, slow_lcp)
184+ ) AS good_cwv,
164185
165- # WV
166- IS_NON_ZERO(fast_fcp, avg_fcp, slow_fcp) AS any_fcp,
167- IS_GOOD(fast_fcp, avg_fcp, slow_fcp) AS good_fcp,
168- IS_NON_ZERO(fast_ttfb, avg_ttfb, slow_ttfb) AS any_ttfb,
169- IS_GOOD(fast_ttfb, avg_ttfb, slow_ttfb) AS good_ttfb,
170- IS_NON_ZERO(fast_inp, avg_inp, slow_inp) AS any_inp,
171- IS_GOOD(fast_inp, avg_inp, slow_inp) AS good_inp
172- FROM geo_summary,
173- UNNEST([1000, 10000, 100000, 1000000, 10000000, 100000000]) AS _rank
174- WHERE rank <= _rank
186+ # WV
187+ IS_NON_ZERO(fast_fcp, avg_fcp, slow_fcp) AS any_fcp,
188+ IS_GOOD(fast_fcp, avg_fcp, slow_fcp) AS good_fcp,
189+ IS_NON_ZERO(fast_ttfb, avg_ttfb, slow_ttfb) AS any_ttfb,
190+ IS_GOOD(fast_ttfb, avg_ttfb, slow_ttfb) AS good_ttfb,
191+ IS_NON_ZERO(fast_inp, avg_inp, slow_inp) AS any_inp,
192+ IS_GOOD(fast_inp, avg_inp, slow_inp) AS good_inp
193+ FROM crux_base
194+ ),
195+ UNNEST(eligible_ranks) AS rank
175196),
176197
177198technologies AS (
@@ -210,56 +231,19 @@ technologies AS (
210231),
211232
212233lab_data AS (
213- SELECT
214- client,
215- page,
216- root_page,
217- SAFE.INT64(summary.bytesTotal) AS bytesTotal,
218- SAFE.INT64(summary.bytesJS) AS bytesJS,
219- SAFE.INT64(summary.bytesImg) AS bytesImg,
220- SAFE.FLOAT64(lighthouse.categories.accessibility.score) AS accessibility,
221- SAFE.FLOAT64(lighthouse.categories['best-practices'].score) AS best_practices,
222- SAFE.FLOAT64(lighthouse.categories.performance.score) AS performance,
223- SAFE.FLOAT64(lighthouse.categories.seo.score) AS seo
224- FROM pages
225- ),
226-
227- audits AS (
228- SELECT DISTINCT
229- client,
230- root_page,
231- technology,
232- version,
233- audit_category,
234- audit_id
235- FROM (
236- SELECT
237- client,
238- page,
239- root_page,
240- audits.category AS audit_category,
241- audits.id AS audit_id
242- FROM pages
243- INNER JOIN UNNEST(get_passed_audits(pages.lighthouse)) AS audits
244- ) AS audits_data
245- INNER JOIN technologies
246- USING (client, page)
247- ),
248-
249- lab_metrics AS (
250234 SELECT
251235 client,
252236 root_page,
253237 technology,
254238 version,
255- AVG(bytesTotal) AS bytesTotal,
256- AVG(bytesJS) AS bytesJS,
257- AVG(bytesImg) AS bytesImg,
258- AVG(accessibility) AS accessibility,
259- AVG(best_practices ) AS best_practices,
260- AVG(performance) AS performance,
261- AVG(seo) AS seo
262- FROM lab_data
239+ AVG(SAFE.INT64(summary. bytesTotal) ) AS bytesTotal,
240+ AVG(SAFE.INT64(summary. bytesJS) ) AS bytesJS,
241+ AVG(SAFE.INT64(summary. bytesImg) ) AS bytesImg,
242+ AVG(SAFE.FLOAT64(lighthouse.categories. accessibility.score) ) AS accessibility,
243+ AVG(SAFE.FLOAT64(lighthouse.categories['best-practices'].score) ) AS best_practices,
244+ AVG(SAFE.FLOAT64(lighthouse.categories. performance.score) ) AS performance,
245+ AVG(SAFE.FLOAT64(lighthouse.categories. seo.score) ) AS seo
246+ FROM pages
263247 INNER JOIN technologies
264248 USING (client, page)
265249 GROUP BY
@@ -269,15 +253,47 @@ lab_metrics AS (
269253 version
270254),
271255
272- origins_summary AS (
256+ base_summary AS (
273257 SELECT
274258 geo,
275259 client,
276260 rank,
277261 technology,
278262 version,
263+
264+ STRUCT(
265+ COUNTIF(good_fid) AS origins_with_good_fid,
266+ COUNTIF(good_cls) AS origins_with_good_cls,
267+ COUNTIF(good_lcp) AS origins_with_good_lcp,
268+ COUNTIF(good_fcp) AS origins_with_good_fcp,
269+ COUNTIF(good_ttfb) AS origins_with_good_ttfb,
270+ COUNTIF(good_inp) AS origins_with_good_inp,
271+ COUNTIF(any_fid) AS origins_with_any_fid,
272+ COUNTIF(any_cls) AS origins_with_any_cls,
273+ COUNTIF(any_lcp) AS origins_with_any_lcp,
274+ COUNTIF(any_fcp) AS origins_with_any_fcp,
275+ COUNTIF(any_ttfb) AS origins_with_any_ttfb,
276+ COUNTIF(any_inp) AS origins_with_any_inp,
277+ COUNTIF(good_cwv) AS origins_with_good_cwv,
278+ COUNTIF(any_lcp AND any_cls) AS origins_eligible_for_cwv,
279+ SAFE_DIVIDE(COUNTIF(good_cwv), COUNTIF(any_lcp AND any_cls)) AS pct_eligible_origins_with_good_cwv
280+ ) AS crux,
281+
282+ STRUCT(
283+ SAFE_CAST(APPROX_QUANTILES(accessibility, 1000)[OFFSET(500)] AS NUMERIC) AS accessibility,
284+ SAFE_CAST(APPROX_QUANTILES(best_practices, 1000)[OFFSET(500)] AS NUMERIC) AS best_practices,
285+ SAFE_CAST(APPROX_QUANTILES(performance, 1000)[OFFSET(500)] AS NUMERIC) AS performance,
286+ SAFE_CAST(APPROX_QUANTILES(seo, 1000)[OFFSET(500)] AS NUMERIC) AS seo
287+ ) AS median_lighthouse_score,
288+
289+ STRUCT(
290+ SAFE_CAST(APPROX_QUANTILES(bytesTotal, 1000)[OFFSET(500)] AS INT64) AS total,
291+ SAFE_CAST(APPROX_QUANTILES(bytesJS, 1000)[OFFSET(500)] AS INT64) AS js,
292+ SAFE_CAST(APPROX_QUANTILES(bytesImg, 1000)[OFFSET(500)] AS INT64) AS images
293+ ) AS median_page_weight_bytes,
294+
279295 COUNT(DISTINCT root_page) AS origins
280- FROM lab_metrics
296+ FROM lab_data
281297 INNER JOIN crux
282298 USING (client, root_page)
283299 GROUP BY
@@ -286,10 +302,8 @@ origins_summary AS (
286302 rank,
287303 technology,
288304 version
289-
290305),
291306
292-
293307audits_summary AS (
294308 SELECT
295309 geo,
@@ -298,9 +312,9 @@ audits_summary AS (
298312 technology,
299313 version,
300314 ARRAY_AGG(STRUCT(
301- audit_category AS category,
302- audit_id AS id,
303- SAFE_DIVIDE(audits.origins, origins_summary.origins) AS pass_rate
315+ category,
316+ id,
317+ pass_origins
304318 )) AS audits
305319 FROM (
306320 SELECT
@@ -309,10 +323,21 @@ audits_summary AS (
309323 rank,
310324 technology,
311325 version,
312- audit_category,
313- audit_id,
314- COUNT(DISTINCT root_page) AS origins
315- FROM audits
326+ category,
327+ id,
328+ COUNT(DISTINCT root_page) AS pass_origins
329+ FROM (
330+ SELECT DISTINCT
331+ client,
332+ page,
333+ root_page,
334+ audits.category,
335+ audits.id
336+ FROM pages
337+ INNER JOIN UNNEST(get_passed_audits(pages.lighthouse)) AS audits
338+ ) AS audits_data
339+ INNER JOIN technologies
340+ USING (client, page)
316341 INNER JOIN crux
317342 USING (client, root_page)
318343 GROUP BY
@@ -321,61 +346,9 @@ audits_summary AS (
321346 rank,
322347 technology,
323348 version,
324- audit_category,
325- audit_id
326- ) AS audits
327- LEFT JOIN origins_summary
328- USING (geo, client, rank, technology, version)
329- GROUP BY
330- geo,
331- client,
332- rank,
333- technology,
334- version
335- ),
336-
337- other_summary AS (
338- SELECT
339- geo,
340- client,
341- rank,
342- technology,
343- version,
344-
345- STRUCT(
346- COUNTIF(good_fid) AS origins_with_good_fid,
347- COUNTIF(good_cls) AS origins_with_good_cls,
348- COUNTIF(good_lcp) AS origins_with_good_lcp,
349- COUNTIF(good_fcp) AS origins_with_good_fcp,
350- COUNTIF(good_ttfb) AS origins_with_good_ttfb,
351- COUNTIF(good_inp) AS origins_with_good_inp,
352- COUNTIF(any_fid) AS origins_with_any_fid,
353- COUNTIF(any_cls) AS origins_with_any_cls,
354- COUNTIF(any_lcp) AS origins_with_any_lcp,
355- COUNTIF(any_fcp) AS origins_with_any_fcp,
356- COUNTIF(any_ttfb) AS origins_with_any_ttfb,
357- COUNTIF(any_inp) AS origins_with_any_inp,
358- COUNTIF(good_cwv) AS origins_with_good_cwv,
359- COUNTIF(any_lcp AND any_cls) AS origins_eligible_for_cwv,
360- SAFE_DIVIDE(COUNTIF(good_cwv), COUNTIF(any_lcp AND any_cls)) AS pct_eligible_origins_with_good_cwv
361- ) AS crux,
362-
363- STRUCT(
364- SAFE_CAST(APPROX_QUANTILES(accessibility, 1000)[OFFSET(500)] AS NUMERIC) AS accessibility,
365- SAFE_CAST(APPROX_QUANTILES(best_practices, 1000)[OFFSET(500)] AS NUMERIC) AS best_practices,
366- SAFE_CAST(APPROX_QUANTILES(performance, 1000)[OFFSET(500)] AS NUMERIC) AS performance,
367- SAFE_CAST(APPROX_QUANTILES(seo, 1000)[OFFSET(500)] AS NUMERIC) AS seo
368- ) AS median_lighthouse_score,
369-
370- STRUCT(
371- SAFE_CAST(APPROX_QUANTILES(bytesTotal, 1000)[OFFSET(500)] AS INT64) AS total,
372- SAFE_CAST(APPROX_QUANTILES(bytesJS, 1000)[OFFSET(500)] AS INT64) AS js,
373- SAFE_CAST(APPROX_QUANTILES(bytesImg, 1000)[OFFSET(500)] AS INT64) AS images
374- ) AS median_page_weight_bytes
375-
376- FROM lab_metrics
377- INNER JOIN crux
378- USING (client, root_page)
349+ category,
350+ id
351+ )
379352 GROUP BY
380353 geo,
381354 client,
@@ -392,15 +365,12 @@ SELECT
392365 technology,
393366 version,
394367
395- # Metrics
396368 origins,
397369 crux,
398370 median_lighthouse_score,
399371 median_page_weight_bytes,
400372 audits
401- FROM origins_summary
402- LEFT JOIN other_summary
403- USING (geo, client, rank, technology, version)
373+ FROM base_summary
404374LEFT JOIN audits_summary
405375USING (geo, client, rank, technology, version)
406376` )
0 commit comments