将旧版 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 POSITION() 函数
无法在 Google BigQuery 中将此旧版 SQL 转换为标准 SQL
如何将 ABS(HASH(...)) 从传统 sql 转换为标准 SQL