9

根据 bigquery 查询参考,目前分位数不允许按另一列进行任何类型的分组。我主要对按某个列分组的中位数感兴趣。我现在看到的唯一解决方法是为每个不同的组成员生成一个分位数查询,其中组成员是 where 子句中的条件。

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

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

谢谢

4

3 回答 3

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
于 2013-06-15T00:30:06.320 回答
1

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

  1. 有改进 QUANTILES 的计划,但我不知道时间表是什么。
  2. 你需要中位数吗?您可以过滤异常值并对其余值进行平均吗?
于 2012-09-19T18:25:05.757 回答
0

order如果您的每组大小是固定的,您可以使用nest和的组合来破解它nth。例如,如果 的f2每个值有 9 个不同的值f1,对于中位数:

在记录中选择 f1,nth(5,f2) (
  选择 f1,nest(f2) f2 从 (
    从表中选择 f1、f2
    按 f1,f2 分组
    按 f2 订购
  ) 按 f1 分组
);

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

于 2012-09-21T07:30:40.027 回答