2013-03-17 4 views
2

Как написать запрос, облегчающий рендеринг графика гистограммы?Использовать bigquery Google для построения графика гистограммы

Например, у нас есть 100 миллионов человек с возрастом, мы хотим нарисовать гистограмму/ведра для возрастов 0-10, 11-20, 21-30 и т. Д. Как выглядит запрос?

Кто-нибудь это сделал? Вы пытались подключить результат запроса к электронной таблице google, чтобы нарисовать гистограмму?

ответ

2

подзапрос идея работает, как это делает «случай, когда», а затем делает группу по:

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 

С другой стороны, если ведра являются регулярными - вы можете просто делить и отливать целое число:

SELECT SUM(field1), bucket 
FROM (
    SELECT field1, INTEGER(age/10) as bucket FROM table1) 
GROUP BY bucket 
+0

Вы можете сделать все более понятным, назвав ведра строками типа '" 0 <= age <10 "', '" 10 <= age <20 "' и т. Д. Кроме того, '' SUM (field1) 'sum значения веков? Я думаю, вы хотите сделать «SELECT 1», чтобы считать только один возраст в ковше один раз. –

+1

Должны ли эти запросы использовать COUNT (field1), а не SUM (field1)? – Vilas

0

Сделать subqery как это:

(SELECT '1' AS agegroup, count(*) FROM people WHERE AGE <= 10 AND AGE >= 0) 

Затем вы можете сделать что-то вроде этого:

SELECT * FROM 
(SELECT '1' AS agegroup, count(*) FROM people WHERE AGE <= 10 AND AGE >= 0), 
(SELECT '2' AS agegroup, count(*) FROM people WHERE AGE <= 20 AND AGE >= 10), 
(SELECT '2' AS agegroup, count(*) FROM people WHERE AGE <= 120 AND AGE >= 20) 

Результат будет как:

Row agegroup count 
1 1  somenumber 
2 2  somenumber 

Я надеюсь, что это поможет вам. Конечно, в возрастной группе вы можете написать что-нибудь вроде: «0 до 10»

0

Вы ищете только один вектор информации. Я обычно запрос так:

select 
    count(*) as num, 
    integer(age/10) as age_group 
from mytable 
group by age_group 

Большого case заявление будет необходим для произвольных групп. Это было бы просто, но намного дольше. Мой пример должен быть хорошим, если каждое ведро содержит N лет.

9

Вы также можете использовать оператор агрегации quantiles, чтобы быстро просмотреть распределение возрастов.

SELECT 
    quantiles(age, 10) 
FROM mytable 

Каждая строка этого запроса соответствует возрасту в этой точке списка веков. Первым результатом является возраст 1/10th пути пути через отсортированный список возрастов, второй - возраст 2/10ths через, 3/10ths и т. Д.

0

Использование перекрестного соединения для получения минимальных и максимальных значений (не так дорого на одном кортеже) вы можете получить нормированный список ведро любого заданного графа ковшом:

select 
    min(data.VAL) as min, 
    max(data.VAL) as max, 
    count(data.VAL) as num, 
    integer((data.VAL-value.min)/(value.max-value.min)*8) as group 
from [table] data 
CROSS JOIN (SELECT MAX(VAL) as max, MIN(VAL) as min, from [table]) value 
GROUP BY group 
ORDER BY group 

в этом примере мы получаем 8 ведер (говорит само за себя) плюс один для нулевой VAL

Смежные вопросы