BigQuery:QUANTILES的GROUP BY子句

时间:2012-09-19 16:51:41

标签: google-bigquery

根据bigquery查询引用,目前Quantiles不允许通过其他列进行任何类型的分组。我主要想要获得按某一列分组的中位数。我现在看到的唯一工作是为每个不同的组成员生成一个分位数查询,其中组成员是where子句中的条件。

例如,如果我想获得所需的结果,我会对列-y中的每个不同行使用以下查询。

SELECT QUANTILE( <column-x>, 1001)
FROM <table>
WHERE 
    <column-y> == <each distinct row in column-y>
  1. 大型查询团队是否计划在将来允许对分位数进行分组?
  2. 有没有更好的方法来获得我想要的东西?
  3. 由于

3 个答案:

答案 0 :(得分:7)

通过最近公布的percentile_cont()窗口功能,您可以获得中位数。

查看公告博客文章中的示例:

http://googlecloudplatform.blogspot.com/2013/06/google-bigquery-bigger-faster-smarter-analytics-functions.html

SELECT MAX(median) AS median, room FROM (
  SELECT percentile_cont(0.5) OVER (PARTITION BY room ORDER BY data) AS median, room
  FROM [io_sensor_data.moscone_io13]
  WHERE sensortype='temperature'
)
GROUP BY room

答案 1 :(得分:1)

虽然有高效的算法来计算分位数,但它们在某种程度上是内存密集型的 - 尝试在单个查询中进行多个分位数计算会变得很昂贵。

  1. 有计划改进QUANTILES,但我不知道时间表是什么。
  2. 你需要中位数吗?你能过滤掉异常值并做其余的平均值吗?

答案 2 :(得分:0)

如果您的每个群组大小已修复,您可以使用ordernestnth的组合来破解它。例如,如果f2的每个值有9个不同的f1值,则为中位数:

select f1,nth(5,f2) within record from (
  select f1,nest(f2) f2 from (
    select f1, f2 from table
    group by f1,f2
    order by f2
  ) group by f1
);

不确定子查询中的排序顺序是否能保证在第二个group中存活,但它在我尝试过的简单测试中起作用。