|
1 | 1 | SELECT |
2 | 2 | client.Geo.CountryCode as country_code, |
3 | 3 | COUNT(*) as sample_count, |
4 | | - APPROX_QUANTILES(a.MeanThroughputMbps, 100)[OFFSET(1)] as download_p1, |
5 | | - APPROX_QUANTILES(a.MeanThroughputMbps, 100)[OFFSET(5)] as download_p5, |
6 | | - APPROX_QUANTILES(a.MeanThroughputMbps, 100)[OFFSET(10)] as download_p10, |
7 | | - APPROX_QUANTILES(a.MeanThroughputMbps, 100)[OFFSET(25)] as download_p25, |
| 4 | + |
| 5 | + -- ============================================================================ |
| 6 | + -- PERCENTILE LABELING CONVENTION FOR IQB QUALITY ASSESSMENT |
| 7 | + -- ============================================================================ |
| 8 | + -- IQB Policy: p95 means "95% of users achieve this performance or better" |
| 9 | + -- |
| 10 | + -- This allows threshold comparison: "Can 95% of users perform this use case?" |
| 11 | + -- |
| 12 | + -- For "lower is better" metrics (latency, packet loss): |
| 13 | + -- - Raw p95 = high value = "95% of users have ≤ 95ms latency" |
| 14 | + -- - This directly answers: "Can 95% of users achieve ≤ threshold?" |
| 15 | + -- - Label: OFFSET(95) → latency_p95 (no inversion needed) ✓ |
| 16 | + -- |
| 17 | + -- For "higher is better" metrics (throughput): |
| 18 | + -- - Raw p95 = high value = "95% of users have ≤ 625 Mbit/s speed" |
| 19 | + -- - But we need: "95% of users have ≥ X Mbit/s speed" |
| 20 | + -- - Solution: Use p5 raw = "95% of users have ≥ 2.76 Mbit/s" |
| 21 | + -- - Mathematical inversion: p(X)_quality = p(100-X)_raw |
| 22 | + -- - Label: OFFSET(5) → download_p95 (inverted!) ✓ |
| 23 | + -- |
| 24 | + -- Example: |
| 25 | + -- Requirement: ≥ 30 Mbit/s download, ≤ 200ms latency for 95% of users |
| 26 | + -- Network A: download_p95 = 10 Mbit/s, latency_p95 = 100ms → FAIL (10 < 30) |
| 27 | + -- Network B: download_p95 = 33 Mbit/s, latency_p95 = 50ms → PASS |
| 28 | + -- ============================================================================ |
| 29 | + |
| 30 | + -- Download throughput (higher is better - INVERTED LABELS!) |
| 31 | + -- ⚠️ OFFSET(99) = top speed = worst of top 1% → labeled as p1 |
| 32 | + -- ⚠️ OFFSET(5) = 5th percentile raw = 95% have MORE → labeled as p95 |
| 33 | + APPROX_QUANTILES(a.MeanThroughputMbps, 100)[OFFSET(99)] as download_p1, |
| 34 | + APPROX_QUANTILES(a.MeanThroughputMbps, 100)[OFFSET(95)] as download_p5, |
| 35 | + APPROX_QUANTILES(a.MeanThroughputMbps, 100)[OFFSET(90)] as download_p10, |
| 36 | + APPROX_QUANTILES(a.MeanThroughputMbps, 100)[OFFSET(75)] as download_p25, |
8 | 37 | APPROX_QUANTILES(a.MeanThroughputMbps, 100)[OFFSET(50)] as download_p50, |
9 | | - APPROX_QUANTILES(a.MeanThroughputMbps, 100)[OFFSET(75)] as download_p75, |
10 | | - APPROX_QUANTILES(a.MeanThroughputMbps, 100)[OFFSET(90)] as download_p90, |
11 | | - APPROX_QUANTILES(a.MeanThroughputMbps, 100)[OFFSET(95)] as download_p95, |
12 | | - APPROX_QUANTILES(a.MeanThroughputMbps, 100)[OFFSET(99)] as download_p99, |
| 38 | + APPROX_QUANTILES(a.MeanThroughputMbps, 100)[OFFSET(25)] as download_p75, |
| 39 | + APPROX_QUANTILES(a.MeanThroughputMbps, 100)[OFFSET(10)] as download_p90, |
| 40 | + APPROX_QUANTILES(a.MeanThroughputMbps, 100)[OFFSET(5)] as download_p95, |
| 41 | + APPROX_QUANTILES(a.MeanThroughputMbps, 100)[OFFSET(1)] as download_p99, |
| 42 | + |
| 43 | + -- Latency/MinRTT (lower is better - no inversion) |
| 44 | + -- Raw percentiles directly represent "X% of users have ≤ this latency" |
13 | 45 | APPROX_QUANTILES(a.MinRTT, 100)[OFFSET(1)] as latency_p1, |
14 | 46 | APPROX_QUANTILES(a.MinRTT, 100)[OFFSET(5)] as latency_p5, |
15 | 47 | APPROX_QUANTILES(a.MinRTT, 100)[OFFSET(10)] as latency_p10, |
|
19 | 51 | APPROX_QUANTILES(a.MinRTT, 100)[OFFSET(90)] as latency_p90, |
20 | 52 | APPROX_QUANTILES(a.MinRTT, 100)[OFFSET(95)] as latency_p95, |
21 | 53 | APPROX_QUANTILES(a.MinRTT, 100)[OFFSET(99)] as latency_p99, |
| 54 | + |
| 55 | + -- Packet Loss Rate (lower is better - no inversion) |
| 56 | + -- Raw percentiles directly represent "X% of users have ≤ this loss rate" |
22 | 57 | APPROX_QUANTILES(a.LossRate, 100)[OFFSET(1)] as loss_p1, |
23 | 58 | APPROX_QUANTILES(a.LossRate, 100)[OFFSET(5)] as loss_p5, |
24 | 59 | APPROX_QUANTILES(a.LossRate, 100)[OFFSET(10)] as loss_p10, |
|
0 commit comments