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 <single nested table>, 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 中的多个重复结构的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 BigQuery 旧版 sql 查询相同的重复字符串字段以获取多个值?