BigQuery:如何获取列中特定字段的值?
Posted
技术标签:
【中文标题】BigQuery:如何获取列中特定字段的值?【英文标题】:BigQuery: How to get the value of specific filed in a column? 【发布时间】:2018-08-18 16:53:35 【问题描述】:我有一个三列的表。我想从每一列中提取特定字段并添加它们。例如,我想添加 2、33 和 111。
在 BigQuery 中执行此操作的有效/优化方式是什么?
谢谢。
【问题讨论】:
您实际上有一个名为Row
的列吗?如果不是,那么是什么决定了这个顺序?
行不是列。 BigQuery 只是以这种方式存储数据。
那你需要告诉我们如何生成这个订单。不应依赖您所看到的顺序。您希望S1
列确定顺序吗?
我正在使用此查询生成该表。 imgur.com/a/hyLk9IT
【参考方案1】:
一种选择是枢轴方法,如下所示:
SELECT
MAX(CASE WHEN Row = 2 THEN S1 END) +
MAX(CASE WHEN Row = 3 THEN S2 END) +
MAX(CASE WHEN Row = 1 THEN S3 END) AS the_sum
FROM yourTable;
如果您实际上没有Row
列,那么我们可以轻松地在 CTE 中生成一个,使用其他列之一来提供排序,例如
WITH cte AS (
SELECT *,
ROW_NUMBER() OVER (ORDER BY S1) Row
FROM yourTable
)
然后,使用我上面给出的第一个查询,但使用cte
作为表,而不是yourTable
。
这是一个 SQL Server 的演示,它至少展示了基本逻辑的工作原理:
Demo
【讨论】:
我只是用那个表来理解这个概念。实际上,我有一个超过 10 列的非常大的数据集,我认为这个解决方案不可扩展。 @John 我认为您正在尝试使用像 Excel 电子表格这样的 SQL 表,这意味着设计不好,而不是我的查询不好。 兄弟,你的问题太棒了:)。对此,我真的非常感激。但正如我提到的,我正在学习 bigquery/sql 概念,所以你能告诉我这样做的更好方法/设计是什么。 :) 我很难进一步评论。当您获得更多列时,这里给出的答案会发生什么?为什么它们会失败/变得无法使用? 成功了。对于不理解您的询问,我深表歉意。再次感谢。保持祝福:)【参考方案2】:我会这样写:
select sum(case when row = 1 then s3
when row = 2 then s1
when row = 3 then s2
end)
from t;
我不认为你可以比没有group by
的聚合更优化。
【讨论】:
我只是用那个表来理解这个概念。实际上,我有一个超过 10 列的非常大的数据集,我认为这个解决方案不可扩展。 谢谢兄弟。 :) @john 。 . .这怎么不是“可扩展的”?以上是关于BigQuery:如何获取列中特定字段的值?的主要内容,如果未能解决你的问题,请参考以下文章
如何从 Bigquery 中的这个嵌套 JSON 类型列中查询特定的内容
如何在 BigQuery 的标准 SQL 中解析具有不同日期字符串的列中的值