一次选择中的 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 函数和清理结果数据的方法后,我选择了更多列

BigQuery 中的 Unnest 导致“数组”错误

查看 Google Analytics 时如何 UNNEST 和展平 BigQuery 中的所有记录

对 Google Bigquery 中的嵌套字段使用 OFFSET 而不是 UNNEST

unnest 是不是始终在 Bigquery 中按命中数的升序显示数据