Sql 大查询:当一个表包含用户ID数组时,如何连接用户ID上的两个表?
StackOverflow上已经发布了一些类似的答案,但它们并没有针对这个特定的案例,或者涉及到一个我无法理解的查询,因为我刚刚开始了我的第一个SQL相关职位 这是我第一次尝试以数组的形式连接在其中一个表中具有列值的表。在尝试解决我自己的问题后,我遇到了以下错误:Sql 大查询:当一个表包含用户ID数组时,如何连接用户ID上的两个表?,sql,arrays,google-bigquery,inner-join,Sql,Arrays,Google Bigquery,Inner Join,StackOverflow上已经发布了一些类似的答案,但它们并没有针对这个特定的案例,或者涉及到一个我无法理解的查询,因为我刚刚开始了我的第一个SQL相关职位 这是我第一次尝试以数组的形式连接在其中一个表中具有列值的表。在尝试解决我自己的问题后,我遇到了以下错误:运算符没有匹配的签名=对于参数类型:数组、字符串 我有两个表,如下所示: 表1: team_id user_id 1 [1, 2, 3] 2 [4, 5, 6] 3 [7,
运算符没有匹配的签名=对于参数类型:数组、字符串
我有两个表,如下所示:
表1:
team_id user_id
1 [1, 2, 3]
2 [4, 5, 6]
3 [7, 8, 9]
4 [10, 11, 12]
表2:
user_id value
2 10
5 20
7 30
12 40
我想通过让表2分析表1的数组中是否有匹配的用户id,将表2连接到表1。如果有,则基于公共用户id加入,并输出如下结果:
期望输出
team_id user_id value
1 2 10
2 5 20
3 7 30
4 12 40
提前感谢您分享您的知识 您可以在
unnest()上加入:
您可以在unest()上加入:
下面是BigQuery标准SQL
#standardSQL
SELECT team_id,
ARRAY_AGG(t2.user_id IGNORE NULLS) user_id,
IFNULL(SUM(value), 0) value
FROM `project.dataset.table1` t, t.user_id AS user_id
LEFT JOIN `project.dataset.table2` t2
USING(user_id)
GROUP BY team_id
您可以使用与您的示例数据类似的示例数据测试、播放上述内容,如下例所示
#standardSQL
WITH `project.dataset.table1` AS (
SELECT 1 team_id, [1, 2, 3] user_id UNION ALL
SELECT 2, [4, 5, 6] UNION ALL
SELECT 3, [7, 8, 9] UNION ALL
SELECT 4, [10, 11, 12] UNION ALL
SELECT 5, [13, 14]
), `project.dataset.table2` AS (
SELECT 2 user_id, 10 value UNION ALL
SELECT 3, 20 UNION ALL
SELECT 5, 20 UNION ALL
SELECT 7, 30 UNION ALL
SELECT 9, 1 UNION ALL
SELECT 12, 40
)
SELECT team_id,
ARRAY_AGG(t2.user_id IGNORE NULLS) user_id,
IFNULL(SUM(value), 0) value
FROM `project.dataset.table1` t, t.user_id AS user_id
LEFT JOIN `project.dataset.table2` t2
USING(user_id)
GROUP BY team_id
有输出
下面是BigQuery标准SQL
#standardSQL
SELECT team_id,
ARRAY_AGG(t2.user_id IGNORE NULLS) user_id,
IFNULL(SUM(value), 0) value
FROM `project.dataset.table1` t, t.user_id AS user_id
LEFT JOIN `project.dataset.table2` t2
USING(user_id)
GROUP BY team_id
您可以使用与您的示例数据类似的示例数据测试、播放上述内容,如下例所示
#standardSQL
WITH `project.dataset.table1` AS (
SELECT 1 team_id, [1, 2, 3] user_id UNION ALL
SELECT 2, [4, 5, 6] UNION ALL
SELECT 3, [7, 8, 9] UNION ALL
SELECT 4, [10, 11, 12] UNION ALL
SELECT 5, [13, 14]
), `project.dataset.table2` AS (
SELECT 2 user_id, 10 value UNION ALL
SELECT 3, 20 UNION ALL
SELECT 5, 20 UNION ALL
SELECT 7, 30 UNION ALL
SELECT 9, 1 UNION ALL
SELECT 12, 40
)
SELECT team_id,
ARRAY_AGG(t2.user_id IGNORE NULLS) user_id,
IFNULL(SUM(value), 0) value
FROM `project.dataset.table1` t, t.user_id AS user_id
LEFT JOIN `project.dataset.table2` t2
USING(user_id)
GROUP BY team_id
有输出
如果表2中有多个用户与表1中的团队id匹配,该怎么办?@MikhailBerlyant我目前正在尝试实现发布的答案,但如果您有时间,我希望看到如何加入表,以防表2中有多个用户与表1中的团队id匹配我希望看到如何…
-当然。看看我的答案。考虑一下投票吧,如果它有帮助的话:O。感谢您一如既往地分享您的知识。我会很快回复你如果表2的多个用户与表1中的团队id匹配怎么办?@MikhailBerlyant我目前正在尝试实现发布的答案,但如果你有时间,我想看看如何加入表,以防表2的多个用户与表1中的团队id匹配我想看看如何…
-当然。看看我的答案。考虑一下投票吧,如果它有帮助的话:O。感谢您一如既往地分享您的知识。我会很快回复你的Mikhail,谢谢你的例子!正如我所承诺的,我今天花了一些时间来阅读这段代码并真正理解它。了解我以前从未使用过的IFNULL()函数非常有帮助,现在我知道它用于避免查询中基于零的错误。我还注意到,您添加了一个额外的角落案例,说明如何处理在另一个表中找不到user_id的情况。你总是第一个回答我的问题,谢谢你!我从您的示例中注意到,即使我有一个用于公共列的数组,联接语法也不会改变!正如我所承诺的,我今天花了一些时间来阅读这段代码并真正理解它。了解我以前从未使用过的IFNULL()函数非常有帮助,现在我知道它用于避免查询中基于零的错误。我还注意到,您添加了一个额外的角落案例,说明如何处理在另一个表中找不到user_id的情况。你总是第一个回答我的问题,谢谢你!我从您的示例中注意到,即使我有一个用于公共列的数组,联接语法也不会改变。