Google bigquery BigQuery:以近似数量计算元素
我想知道是否有一种方法可以计算在由大约分位数创建的桶中发现了多少元素?我想我实际上在寻找一种在BigQuery标准SQL中创建直方图的方法。有这样做的选项吗?我想您可能需要相反的,它返回顶部元素的频率,达到您提供的限制 从文件中: 选择近似顶部计数X,选择2作为近似顶部计数 从UNNEST[苹果,苹果,梨,梨,梨,香蕉]取x; +-------------+ |大约顶部数量| +-------------+ |[{梨,3},{苹果,2}]| +-------------+Google bigquery BigQuery:以近似数量计算元素,google-bigquery,Google Bigquery,我想知道是否有一种方法可以计算在由大约分位数创建的桶中发现了多少元素?我想我实际上在寻找一种在BigQuery标准SQL中创建直方图的方法。有这样做的选项吗?我想您可能需要相反的,它返回顶部元素的频率,达到您提供的限制 从文件中: 选择近似顶部计数X,选择2作为近似顶部计数 从UNNEST[苹果,苹果,梨,梨,梨,香蕉]取x; +-------------+ |大约顶部数量| +-------------+ |[{梨,3},{苹果,2}]| +-------------+ 问题的标题是用大约_分
问题的标题是用大约_分位数计算元素,我将回答这个问题。因为你的最终目标是 要计算每个存储桶中的元素数量,我们可以执行以下操作:
WITH data AS (
SELECT *, ActualElapsedTime datapoint
FROM `fh-bigquery.flights.ontime_201903`
WHERE FlightDate_year = "2018-01-01"
AND Origin = 'SFO' AND Dest = 'JFK'
)
, quantiles AS (
SELECT *, IFNULL(LEAD(bucket_start) OVER(ORDER BY bucket_i) , 0100000) bucket_end
FROM UNNEST((
SELECT APPROX_QUANTILES(datapoint, 10)
FROM data
)) bucket_start WITH OFFSET bucket_i
)
SELECT COUNT(*) count, bucket_i
, ANY_VALUE(STRUCT(bucket_start, bucket_end)) b, MIN(datapoint) min, MAX(datapoint) max
FROM data
JOIN quantiles
ON data.datapoint >= bucket_start AND data.datapoint < bucket_end
GROUP BY bucket_i
ORDER BY bucket_i
通过可视化,我们得到如下结果:
WITH data AS (
SELECT *, ActualElapsedTime datapoint
FROM `fh-bigquery.flights.ontime_201903`
WHERE FlightDate_year = "2018-01-01"
AND Origin = 'SFO' AND Dest = 'JFK'
)
, quantiles AS (
SELECT *, IFNULL(LEAD(bucket_start) OVER(ORDER BY bucket_i) , 0100000) bucket_end
FROM UNNEST((
SELECT APPROX_QUANTILES(datapoint, 10)
FROM data
)) bucket_start WITH OFFSET bucket_i
)
SELECT COUNT(*) count, bucket_i
, ANY_VALUE(STRUCT(bucket_start, bucket_end)) b, MIN(datapoint) min, MAX(datapoint) max
FROM data
JOIN quantiles
ON data.datapoint >= bucket_start AND data.datapoint < bucket_end
GROUP BY bucket_i
ORDER BY bucket_i
这告诉我们:
不要使用近似分位数来构建直方图,因为每个存储桶最终将拥有大约相同数量的元素。这就是分位数的目标。
近似分位数是非常近似的。正如您所看到的,每个分位数的元素数量并不相同。
从SFO飞到JFK大约需要305到357分钟。
不,因为我有一个连续的数字范围,而不是分类选项。