【发布时间】:2013-04-06 09:19:54
【问题描述】:
...花了几个小时尝试并研究这个论坛。在这一点上,对于 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 不支持相关查询。以下是其他人的类似尝试,但结果非常不令人满意且效率低下:
任何想法如何做到这一点?如果有帮助,我什至可以重组数据以使用嵌套记录。提前谢谢!
【问题讨论】:
-
在得到您要寻找的答案之前,我想回顾一下这个问题中的许多陈述。但首先,一个问题:为什么是 0.6*rank(weight) + 0.4*rank(height) 而不是 0.6*weight + 0.4*height?规范化?这个公式的问题是,如果一个国家的高度最小,无论身高是100cm还是50cm,它都会得到相同的数字。在所描述的场景中,这应该很重要。
-
Fh,是的,归一化是原因。如果你有 N 个国家,那么每个度量的排名将是 1..10,所以 0.6*rank(weight) + 0.4*rank(height ) 将忽略度量单位并加权纯排名。相反,0.6*weight + 0.4*height 将影响测量单位的大小,例如,如果您以毫米为单位测量高度(2m = 2000mm),那么高度将使重量相形见绌。
-
Fh,假设一个国家的高度最小,但重量最大,而您采取的两个措施的权重相等 (0.5)。那么这将使该国家在综合得分中处于中间位置,也许不是最佳选择。上面的示例很简单,但您可以想象一个包含 10 个度量和 1000 条记录的表。我的观点是,这是 GBQ 无法以任何方式提供的经典分析处理(除非你能指出如何做到这一点并证明我错了)
标签: google-bigquery