Bigquery 中的多个重复结构

Posted

技术标签:

【中文标题】Bigquery 中的多个重复结构【英文标题】:Multiple repeated structures in Bigquery 【发布时间】:2017-08-08 17:43:47 【问题描述】:

跟进此事-Bigquery multiple unnest in a single select

我们使用 bigquery 作为我们的仓储解决方案,并试图通过整合来突破极限。一个简单的例子是客户跟踪。客户产生收入,在我们的网站上有多个接触点,并在我们这里独立维护多个帐户。对于想要对客户进行行为分析的业务用户,他们想要跟踪访问量、产生的收入以及他们的帐户如何影响留存率,我们正在尝试评估嵌套结构是否适合我们

下面是一个例子。我有 3 张桌子。

客户 (C)

C_Key| C_Name

-----|------

1 | ABC

2 |防御


帐户 (A)

A_Key | C_Key 11 | 1 12 | 1 21 | 2 22 | 2

23 | 2

收入 (R)

R_Key | C_Key |收入

-------|---------|----------

11 | 1 | $10

12 | 1 | $20

21 | 2 | $10

我使用 array_agg 将这三个组合成一个嵌套表,如下所示:

Client,
    Accounts:
          [
            ],
    Revenue:
          [
              ]
  

我希望能够在单个查询中使用多个取消嵌套,如下所示

 Select client, Count Distinct(Accounts) and SUM(Revenue) from <single nested 
    table>, unnest accounts, unnest revenue

预期输出为 2 行,

1,2,30 美元

2,3,10 美元

但是,在同一个查询中有多个未嵌套会导致交叉连接。 实际输出为

1,2,60 美元

2,3,30 美元

【问题讨论】:

抱歉,不清楚您在问什么。你能提供一个你想要的具体例子吗? ***.com/help/how-to-ask我不知道这个问题是关于权限、查询还是数据建模。 对不起,这里是。问题主要是在 bigquery 中对嵌套结构进行建模。例如3张桌子。客户 (C)、账户 (A)、收入 (R)。 (C) 与 (A) 和 (R) 具有一对多的关系。我最初的假设是我可以使用嵌套模型来存储所有上述信息,并根据需要使用单个选择取消嵌套它们。当我尝试Select client, Count Distinct(Accounts) and SUM(Revenue) from &lt;single nested table&gt;, unnest accounts, unnest revenue 时,1:M 关系会导致重复我得到重复。我想构建一个通用结构来允许临时查询。 请编辑您的问题(不要为此使用 cmets!)以显示您遇到问题的代码的Minimal, Complete, and Verifiable example,然后我们可以尝试帮助解决具体问题。也提供数据示例。所以我们实际上可以帮助你! 【参考方案1】:

以下是 BigQuery 标准 SQL

首先让我们澄清single nested table的创建

我希望你做了类似的事情:

#standardSQL
WITH clients AS (
  SELECT 1 AS c_key, 'abc' AS c_name UNION ALL
  SELECT 2, 'def'
), accounts AS (
  SELECT 11 AS a_key, 1 AS c_key UNION ALL
  SELECT 12, 1 UNION ALL
  SELECT 21, 2 UNION ALL
  SELECT 22, 2 UNION ALL
  SELECT 23, 2
), revenue AS (
  SELECT 11 AS r_key, 1 AS c_key, 10 AS revenue UNION ALL
  SELECT 12, 1, 20 UNION ALL
  SELECT 21, 2, 10
), single_nested_table AS (
  SELECT x.c_key, x.c_name, accounts, revenue 
  FROM (
    SELECT c.c_key, c_name, ARRAY_AGG(a) AS accounts --, array_agg(r) as revenue  
    FROM clients AS c
    LEFT JOIN accounts AS a ON a.c_key = c.c_key
    GROUP BY c.c_key, c_name
  ) x
  JOIN (
    SELECT c.c_key, c_name, ARRAY_AGG(r) AS revenue  
    FROM clients AS c
    LEFT JOIN revenue AS r ON r.c_key = c.c_key
    GROUP BY c.c_key, c_name
  ) y
  ON x.c_key = y.c_key
)
SELECT *
FROM single_nested_table  

创建表为

Row c_key c_name accounts.a_key accounts.c_key revenue.r_key revenue.c_key revenue.revenue
1   1     abc    11             1              11            1             10    
                 12             1              12            1             20    
2   2     def    21             2              21            2             10    
                 22             2                
                 23             2                

您用于创建该表的确切查询并不那么重要 - 但清除结构/架构很重要!

那么现在,回到你的问题

#standardSQL
WITH clients AS (
  SELECT 1 AS c_key, 'abc' AS c_name UNION ALL
  SELECT 2, 'def'
), accounts AS (
  SELECT 11 AS a_key, 1 AS c_key UNION ALL
  SELECT 12, 1 UNION ALL
  SELECT 21, 2 UNION ALL
  SELECT 22, 2 UNION ALL
  SELECT 23, 2
), revenue AS (
  SELECT 11 AS r_key, 1 AS c_key, 10 AS revenue UNION ALL
  SELECT 12, 1, 20 UNION ALL
  SELECT 21, 2, 10
), single_nested_table AS (
  SELECT x.c_key, x.c_name, accounts, revenue 
  FROM (
    SELECT c.c_key, c_name, ARRAY_AGG(a) AS accounts --, array_agg(r) as revenue  
    FROM clients AS c
    LEFT JOIN accounts AS a ON a.c_key = c.c_key
    GROUP BY c.c_key, c_name
  ) x
  JOIN (
    SELECT c.c_key, c_name, ARRAY_AGG(r) AS revenue  
    FROM clients AS c
    LEFT JOIN revenue AS r ON r.c_key = c.c_key
    GROUP BY c.c_key, c_name
  ) y
  ON x.c_key = y.c_key
)
SELECT 
  c_key, c_name, 
  ARRAY_LENGTH(accounts) AS distinct_accounts, 
  (SELECT SUM(revenue) FROM UNNEST(revenue)) AS revenue
FROM single_nested_table   

这给出了你所要求的:

Row c_key   c_name  distinct_accounts   revenue  
1   1       abc     2                   30   
2   2       def     3                   10   

【讨论】:

这是很棒的帮助。谢谢!要回答您之前的问题,是的,单个嵌套表是我所拥有的(应该在那里更清楚)。但是,您的最终查询是我正在寻找的并且做了我想要的。顺便说一句,到目前为止,我们正在使用 BQ Mate 并且喜欢它!无法对此回复投票,因为我是该网站的新手,但我的 Q 已被回答。 @Subah - 至少你可以接受答案 :) 这会增加你的声誉顺便说一句,之后你可能会得到足够的开始 viting :o) 是的,我做的第一件事就是接受答案。它只是尖叫它不会在网站上显示它。除非我错过了点击正确的选项。 谢谢@Mikhail。我需要学习更好地阅读文档。就这么做了。 哈哈。同意!

以上是关于Bigquery 中的多个重复结构的主要内容,如果未能解决你的问题,请参考以下文章

在 Google BigQuery 中展平多个重复字段

如何使用 BigQuery 旧版 sql 查询相同的重复字符串字段以获取多个值?

在 BigQuery 中取消嵌套多个嵌套字段

在 Firebase (BigQuery) 中的一个/多个事件中获取多个参数的唯一计数

使用 BigQuery 读取 JSON 结构时重复数据

在 BigQuery 中展平嵌套和重复的结构(标准 SQL)