一次选择中的 Bigquery 多个 unnest
Posted
技术标签:
【中文标题】一次选择中的 Bigquery 多个 unnest【英文标题】:Bigquery multiple unnest in a single select 【发布时间】:2017-08-08 04:41:15 【问题描述】:跟进此事 - Bigquery combining repeated fields from 2 different tables
@ElliottBrossard 提供的上述解决方案正是我所寻找的。谢谢!我需要从上面 UNNEST 字段以获取学生的聚合。比如说,有一个额外的成本字段(每门课程)例如假设上面的输出在 student_courses 表中,我需要做类似的事情,
SELECT
COUNT(DISTINCT phone.number),
COUNT(DISTINCT courses.Id),
SUM(courses.Cost)
FROM
student_courses,
UNNEST(phone),
UNNEST(courses)
我从上面得到的预期答案是 3、4、800 美元(假设 4 门课程每门花费 200 美元)。上面的查询最终表现得像一个交叉连接。是否可以使用单个 Select 从多个嵌套中获取聚合?
【问题讨论】:
【参考方案1】:这是一个想法,虽然有点冗长:
#standardSQL
SELECT
(SELECT COUNT(DISTINCT number)
FROM UNNEST(numbers) AS number),
(SELECT COUNT(DISTINCT course_id)
FROM UNNEST(course_ids) AS course_id),
course_sum
FROM (
SELECT
ARRAY_CONCAT_AGG(
ARRAY(SELECT number FROM UNNEST(phone))
) AS numbers,
ARRAY_CONCAT_AGG(
ARRAY(SELECT id FROM UNNEST(courses))
) AS course_ids,
SUM((SELECT SUM(cost) FROM UNNEST(courses))) AS course_sum
FROM YourTable
);
参考资料:
ARRAY_CONCAT_AGG
UNNEST
【讨论】:
感谢@Elliott 的快速回复,这很有帮助。我可能应该添加一些上下文。我们正在尝试构建像上面这样的数据结构,以支持使用 Tableau 的即席报告。鉴于使用嵌套结构的建议,我们正在尝试替换我们的非规范化/扁平化模型,而不会从最终用户的角度影响其简单性。由于我们有 100 种措施,从实施的角度来看,上述措施可能不可行。 澄清一下,您有数百个独立重复的字段,您想对其执行不同的计数?我为你提出的问题写了一个答案……不是你没有交流的那个。 因此我的澄清:) 因此我的澄清:)。我们使用 bigquery 作为我们的仓储解决方案,并试图通过整合来突破极限。一个简单的例子是客户跟踪。客户产生收入,在我们的网站上有多个接触点,并独立维护着我们的多个帐户。对于希望对客户进行行为分析的业务用户,他们希望跟踪访问次数、产生的收入以及他们的帐户如何影响留存率,我们正在尝试评估嵌套结构是否适合我们。 在这种情况下,请提交一个包含所有相关要求的不同问题。以上是关于一次选择中的 Bigquery 多个 unnest的主要内容,如果未能解决你的问题,请参考以下文章
如何在子查询的 WHERE 子句中使用来自 UNNEST 的多个值?
BigQuery:在使用 UNNEST 函数和清理结果数据的方法后,我选择了更多列
查看 Google Analytics 时如何 UNNEST 和展平 BigQuery 中的所有记录