Solución:
También puede utilizar el quantiles
operador de agregación para ver rápidamente la distribución de edades.
SELECT
quantiles(age, 10)
FROM mytable
Cada fila de esta consulta correspondería a la edad en ese punto en la lista de edades. El primer resultado es la edad de 1/10 del camino a través de la lista ordenada de edades, el segundo es la edad de 2/10 a, 3/10, etc.
Vea la actualización de 2019, con #standardSQL –Fh
La idea de la subconsulta funciona, al igual que “CASE WHEN” y luego hacer un grupo de la siguiente manera:
SELECT SUM(field1), bucket
FROM (
SELECT field1, CASE WHEN age >= 0 AND age < 10 THEN 1
WHEN age >= 10 AND age < 20 THEN 2
WHEN age >= 20 AND age < 30 THEN 3
...
ELSE -1 END as bucket
FROM table1)
GROUP BY bucket
Alternativamente, si los depósitos son regulares, puede dividir y convertir a un número entero:
SELECT SUM(field1), bucket
FROM (
SELECT field1, INTEGER(age / 10) as bucket FROM table1)
GROUP BY bucket
Con #standardSQL y un auxiliar stats
consulta, podemos definir el rango en el que debe mirar el histograma.
Aquí para el tiempo para volar entre SFO y JFK – con 10 cubos:
WITH data AS (
SELECT *, ActualElapsedTime datapoint
FROM `fh-bigquery.flights.ontime_201903`
WHERE FlightDate_year = "2018-01-01"
AND Origin = 'SFO' AND Dest="JFK"
)
, stats AS (
SELECT min+step*i min, min+step*(i+1)max
FROM (
SELECT max-min diff, min, max, (max-min)/10 step, GENERATE_ARRAY(0, 10, 1) i
FROM (
SELECT MIN(datapoint) min, MAX(datapoint) max
FROM data
)
), UNNEST(i) i
)
SELECT COUNT(*) count, (min+max)/2 avg
FROM data
JOIN stats
ON data.datapoint >= stats.min AND data.datapoint<stats.max
GROUP BY avg
ORDER BY avg
Si necesita números redondos, consulte: https://stackoverflow.com/a/60159876/132438