【问题标题】:weighted ranking/ combined score in Google Big QueryGoogle Big Query 中的加权排名/综合得分
【发布时间】: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 不支持相关查询。以下是其他人的类似尝试,但结果非常不令人满意且效率低下:

BigQuery SQL running totals

Row number in BigQuery?

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

【问题讨论】:

  • 在得到您要寻找的答案之前,我想回顾一下这个问题中的许多陈述。但首先,一个问题:为什么是 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


【解决方案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 尚不直接支持分析功能,但我们会将其视为功能请求。 :-)

【讨论】:

    【解决方案2】:

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

    例如,Wikipedia 的前 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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-22
      • 2013-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多