使用google bigquery构建直方图

Tom*_*man 5 sql google-bigquery

如何编写使直方图图形渲染更容易的查询?

例如,我们有1亿人年龄,我们想绘制0-10,11-20,21-30等年龄的直方图/桶...查询是什么样的?

有人做过吗?您是否尝试将查询结果连接到Google电子表格以绘制直方图?

Mat*_*aus 13

您还可以使用quantiles聚合运算符快速查看年龄分布.

SELECT
  quantiles(age, 10)
FROM mytable
Run Code Online (Sandbox Code Playgroud)

此查询的每一行都对应于年龄列表中该点的年龄.第一个结果是通过排序的年龄列表的年龄的十分之一,第二个是年龄的2/10th,3/10等.

  • 这是一个遗留的 SQL 参数,需要在运行时指定。标准 SQL 现在具有 APPROXIMATE_QUANTILES 函数。 (4认同)
  • 在 BigQuery 中,该函数是“APPROX_QUANTILES”。https://cloud.google.com/bigquery/docs/reference/standard-sql/functions-and-operators#approx_quantiles (2认同)

Fel*_*ffa 8

使用#standardSQL 和辅助stats查询,我们可以定义直方图应该查看的范围。

这是在 SFO 和 JFK 之间飞行的时间 - 有 10 个桶:

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
Run Code Online (Sandbox Code Playgroud)

如果您需要整数,请参阅:https : //stackoverflow.com/a/60159876/132438

在此处输入图片说明

在此处输入图片说明


Jor*_*ani 5

使用#standardSQL --Fh 查看2019年更新


子查询的想法和“ CASE WHEN”一样有效,然后按以下方式进行分组:

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
Run Code Online (Sandbox Code Playgroud)

或者,如果存储桶是规则的,则可以将它们除并转换为整数:

SELECT SUM(field1), bucket 
FROM (
    SELECT field1, INTEGER(age / 10) as bucket FROM table1)
GROUP BY bucket
Run Code Online (Sandbox Code Playgroud)

  • 这些查询应该使用COUNT(field1)而不是SUM(field1)吗? (3认同)