3

...花了几个小时尝试什么不是和研究这个论坛。在这一点上,对于 Google Big Query (GBQ) 对琐碎查询以外的任何事情的有用性相当悲观,但这是最后一次绝望的尝试,也许有人有更好的想法:

假设我们有一个 COUNTRY 表,其中包含每个国家/地区的平均人口体重(以千克为单位)和身高(以米为单位),如下所示:

  国家 | 大陆| 重量 | 身高 |
  ============================================
  美国 | 美国 | 200 | 2.00 |
  加拿大 | 美国 | 170 | 1.90 |
  法国 | 欧洲 | 160 | 1.78 |
  德国 | 欧洲 | 110 | 2.00 |

假设您想挑选并居住在“最小”人的欧洲国家,您将度量“小”定义为体重和身高的加权总和,具有一些恒定的权重,例如体重为 0.6,体重为 0.4身高。

在 Oracle 或 MS SQL 服务器中,这可以通过使用诸如 rank() 和 row_number() 之类的分析窗口函数来优雅而紧凑地完成,例如:

选择国家,combined_score
从(选择
        国家
       ,( 0.6*rank(weight) over() + 0.4*rank(height) over() ) combined_score
来自国家
其中大陆='欧洲')
按 combine_score 排序

请注意,排名是在大陆过滤之后完成的。大陆过滤器是动态的(比如从网络表单输入),因此无法预先计算排名并提前存储在表格中!

在 GBQ 中没有 rank() 、 row_number() 或 over()。即使你尝试一些“穷人”的黑客攻击,它仍然无法工作,因为 GBQ 不支持相关查询。以下是其他人的类似尝试,但结果非常不令人满意且效率低下:

BigQuery SQL 运行总计

BigQuery 中的行号?

任何想法如何做到这一点?如果有帮助,我什至可以重组数据以使用嵌套记录。先感谢您!

4

2 回答 2

1

BigQuery 中 RANK 的等效项是 row_number()。

例如,维基百科的前 5 位贡献者,其中 row_number 给出了他们的位置:

SELECT
  ROW_NUMBER() OVER() row_number,
  contributor_username,
  count,
FROM (
  SELECT contributor_username, COUNT(*) count,
  FROM [publicdata:samples.wikipedia]
  GROUP BY contributor_username
  ORDER BY COUNT DESC
  LIMIT 5)
于 2013-05-14T04:14:39.337 回答
1

在您的具体示例中,我认为您可以完全不使用 RANK 和 OVER 来计算结果:

SELECT country, score
FROM (SELECT country, 0.6 * weight + 0.4 * height AS score
      FROM t WHERE continent = 'Europe')
ORDER BY score;

但是,我假设这是一个玩具示例,并且您的真正问题涉及使用 RANK 更符合您的示例查询。在这种情况下,BigQuery 尚不直接支持分析功能,但我们会将其视为功能请求。:-)

于 2013-04-24T18:22:50.660 回答