将旧版 SQL 查询转换为标准 SQL

Posted

技术标签:

【中文标题】将旧版 SQL 查询转换为标准 SQL【英文标题】:Converting Legacy SQL Query to Standard SQL 【发布时间】:2019-04-23 21:37:23 【问题描述】:

我希望将以下旧版 SQL 查询转换为标准 SQL。我遇到的问题是我需要取消嵌套两个表(标签和学分)。如何转换此查询?谢谢!

每当我尝试重写此查询时,都会遇到“标量子查询产生了多个元素”(见下文)。

我正在尝试重写的旧版 SQL 查询:

SELECT
  service.description,
  sku.description,
  usage_start_time,
  usage_end_time,
  labels.key,
  labels.value,
  cost,
  usage.amount,
  project.name,
  credits.name,
  credits.amount
FROM
  flatten([gcp_billing_data.gcp_billing_export],
    credits)

到目前为止我在标准 SQL 中的尝试:

SELECT
  service.description AS service,
  sku.description AS sku,
  usage_start_time,
  usage_end_time,
  l.key,
  l.value,
  cost,
  usage.amount AS usage,
  project.name AS project,
  c.name AS credit,
  c.amount
FROM
  `gcp_billing_data.gcp_billing_export`,
  UNNEST(labels) AS l,
  UNNEST(credits) AS c
Group by 1,2,3,4,5,7,8,9,10,11

此查询运行,但行数明显少于我的预期。

【问题讨论】:

对我个人而言 - 您正在使用的原始查询 - 看起来根本不符合要求 - 因为它在标签上重复了多次成本和信用 - 所以总结果最终将比实际结果大 x 倍.因此,如果您可以提供输入数据和预期输出的简化示例 - 并解释您究竟想要得到什么 - 这将加快答案:o) ...虽然快速而正式的修复类似于将(select l.value from unnest(labels) as l) 替换为(select string_agg(l.value) from unnest(labels) as l) 那么学分呢?是否应该与标签交叉连接? @MikhailBerlyant 我不太确定。您可以在旧版 SQL 中看到我需要做的就是选择标签。所以我不确定通过扁平化和“,”连接的性质。我假设这是一个交叉连接?感谢您在之前的评论中提供的帮助。该查询现在运行。 好的。所以,顺便说一句,这就是为什么我要求您发布输入和输出的简化示例,以便我们可以帮助您了解它应该如何工作/如何工作。同时-如果它对您有用-我会将其发布为答案:o) 【参考方案1】:

在标准 SQL 中对您的查询进行快速和正式的修复类似于在下面替换

(select l.value from unnest(labels) as l)    

(select string_agg(l.value) from unnest(labels) as l)   

但它仍然与您的 Legacy SQL 查询版本的初始版本不完全相同

【讨论】:

感谢您发布此内容,虽然这解决了我在尝试的解决方案中看到的错误,但我同意您之前的评论,即这不反映原始查询。 我已根据您的 cmets 更新了原始问题中的查询,但结果中的行数明显少于我的预期。您的想法将不胜感激。

以上是关于将旧版 SQL 查询转换为标准 SQL的主要内容,如果未能解决你的问题,请参考以下文章

如何将旧版 SQL BigQuery 转换为标准 SQL?

标准 sql 中的 bigquery 旧版 sql POSITION() 函数

无法在 Google BigQuery 中将此旧版 SQL 转换为标准 SQL

如何将 ABS(HASH(...)) 从传统 sql 转换为标准 SQL

无法将 BigQuery 旧版 SQL 转换为 HAVING LEFT(...) 的标准 SQL

如何在 BigQuery 中将此旧版 SQL 转换为标准 SQL?