2012-09-19 119 views
7

基于bigquery查询引用,目前Quantiles不允许按其他列进行任何类型的分组。我主要感兴趣的是中位数按特定列分组。我现在看到的唯一工作是为每个不同的组成员生成一个分位数查询,其中组成员是where子句中的一个条件。BigQuery:QUANTILES的GROUP BY子句

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

SELECT QUANTILE(<column-x>, 1001) 
FROM <table> 
WHERE 
    <column-y> == <each distinct row in column-y> 
  1. 上是否有一些功能,允许在未来的位数分组的大查询团队计划?
  2. 有没有更好的方法来获得我想要得到的东西?

感谢

回答

1

虽然有高效的算法来计算位数他们是有点占用大量内存 - 试图做多位数计算在一个查询获取昂贵。

  1. 有计划改善QUANTILES,但我不知道时间表是什么。
  2. 您需要中位数?你可以过滤离群值并平均剩余吗?
+0

我感兴趣的主要是中位数。但99th和99.9th百分点会很高兴。我也无法过滤掉异常值。所以看起来我将不得不运行单独的查询来获得所需的结果。这将是一个不错的功能,可以在未来添加到大型查询中。谢谢回复! – msrivas

0

如果每个组的大小是固定的,你可以使用ordernestnth组合来破解它。举例来说,如果有9个不同的f2f1值值,中位数:

 
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,但它在一个简单的测试,我的工作试过。

6

随着最近公布的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 
+0

Hi @ felipe-hoffa,您在查询引用https://cloud.google.com/bigquery/docs/reference/legacy-sql#percentile_cont中存在错误,因为查询返回1而不是4 – tworec