我需要有关如何使用BigQuery UNNEST函数的帮助。我的查询:
我具有图片中所示的表,并且想要取消当前用逗号分隔的字段“ domains”(字符串类型)的位置,以便将每个逗号分隔的域分配给每个“ acname”的不同行。所需的输出也包含在图像中:
我尝试了这种逻辑,但是没有用:
从project.dataset.dummy_account
中将acc.acname,acc.amount,acc.domains作为accdomains作为acc
CROSS JOIN UNNEST(根据域)
但是这给了错误“ UNNEST中引用的值必须是数组。UNNEST包含类型为STRING的表达式”。该错误完全有意义,但不了解如何将字符串转换为数组。
有人可以提供解决方案的帮助,也可以解释一下它是如何工作的。谢谢。
答案 0 :(得分:2)
以下是用于BigQuery标准SQL
#standardSQL
SELECT acname, amount, domain
FROM `project.dataset.dummy`,
UNNEST(SPLIT(domains)) domain
您可以使用问题中的虚拟数据来测试,玩游戏,如下例所示
#standardSQL
WITH `project.dataset.dummy` AS (
SELECT 'abc' acname, 100 amount, 'a,b,c' domains UNION ALL
SELECT 'pqr', 300, 'p,q,r' UNION ALL
SELECT 'lmn', 500, 'l,m,n'
)
SELECT acname, amount, domain
FROM `project.dataset.dummy`,
UNNEST(SPLIT(domains)) domain
有输出
Row acname amount domain
1 abc 100 a
2 abc 100 b
3 abc 100 c
4 pqr 300 p
5 pqr 300 q
6 pqr 300 r
7 lmn 500 l
8 lmn 500 m
9 lmn 500 n
具有字段“ domains”的源表project.dataset.dummy具有逗号分隔的值,但是在逗号之后有一个空格(例如'a'commaspace'b'commaspacec a,b,c)。这导致在值b c q r m n之前存在空间;在“嵌套后输出”表中的“域”字段中。现在,我以“ salesdomain”为键加入该表。但是由于b c q r m n之前的空间,收到的输出不正确
要解决此问题-您只需使用TRIM函数即可删除所有前导和尾随空格,如下面的示例
#standardSQL
WITH `project.dataset.dummy` AS (
SELECT 'abc' acname, 100 amount, 'a, b, c' domains UNION ALL
SELECT 'pqr', 300, 'p, q, r' UNION ALL
SELECT 'lmn', 500, 'l, m, n'
)
SELECT acname, amount, TRIM(domain, ' ') domain
FROM `project.dataset.dummy`,
UNNEST(SPLIT(domains)) domain