将字符串类型的列转换为数组/记录,即嵌套列

时间:2019-07-05 06:11:57

标签: sql nested google-bigquery

我正在尝试从bigquery数据集中的多个表中进行计算和检索一些指标。我想在navigatedFunc上调用嵌套,这是我暂时不能做的一列字符串,即它可以有值或为null。因此,目标是将该列转换为数组/记录...这就是我想到的主意,我也不知道如何去做。

navigatedFunc: function(args) { // what would I do here or check against? How would you check against a specific screen title you navigated from? } sfamproductcartkey_webdat_loguniv和{{ 1}}。

数据被分解为称为suniv的宇宙,该宇宙由称为fam的子宇宙组成。子宇宙包含被称为“家族”的家族,该子家族可能有也可能没有被称为sfam的子家族。我想在univ上调用嵌套以减少结果列。

数据是从Google Analytics(分析)收集的,用于深入了解网站流量和用户活动。

我正在尝试获取有关每个访问者的信息和指标,他/她在特定页面上花费的时间,所采取的措施等。结果表为我提供了在这些页面上花费的时间总和,一天的总访问次数以及该分类所属的细分的总和,因此,sunivsfam,{{1 }}和prd.sfam属于字符串类型的列(sfam可以为null,因为某些子宇宙suniv仅具有家族univ,而不会下降到子家族级别{{1} }。

  • suniv:指日期

  • fam:产品页面的观看次数

  • sfam:在所述页面上花费的总时间

我尝试了在网上找到的各种方法,但是没有用,所以我发布了代码和问题,希望找到指导和解决方案!

一个更简单的查询是:

fam

这是查询文本和图像中最后6列的示例结果:

同样,我想获得一列数组为sfam,其中所有dat_log的字符串值都为空。

我将输出限制为仅最后6列,前3列是行nrb_fptps_fp。每个 select prd.key_web , dat_log , prd.nrb_fp , prd.tps_fp , prd.univ , prd.suniv , prd.fam , prd.sfam from product as prd left join cart as cart on prd.key_web = cart.key_web and prd.dat_log = cart.dat_log and prd.univ = cart.univ and prd.suniv = cart.suniv and prd.fam = cart.fam and prd.sfam = cart.sfam 都由几个sfam或一个都不组成(空),我希望能够在sfamkey_web上嵌套。

2 个答案:

答案 0 :(得分:2)

  

我想获得一列sfam数组,其中所有sfam的字符串值都为空。

这在BigQuery中是不可能的。如文档所述:

  

目前,BigQuery对于NULL和ARRAY具有以下两个限制:

     

如果查询结果中的ARRAY包含NULL元素,则BigQuery会引发错误,尽管可以在查询内部使用此类ARRAY。

也就是说,您的结果集不能包含包含NULL个元素的数组。

答案 1 :(得分:1)

很明显,在BigQuery中,您无法输出保存NULL的数组,但是如果出于某种原因您需要以某种方式保留它们-解决方法是创建结构数组,而不是单个元素的数组

例如(BigQuery标准SQL),如果您尝试在下面执行

SELECT ['a', 'b', NULL] arr1, ['x', NULL, NULL] arr2    

您将收到错误:Array cannot have a null element; error in writing field arr1

虽然您可以尝试以下操作

SELECT ARRAY_AGG(STRUCT(val1, val2)) arr
FROM UNNEST(['a', 'b', NULL]) val1 WITH OFFSET
JOIN UNNEST(['x', NULL, NULL]) val2 WITH OFFSET
USING(OFFSET)

您获得结果

Row     arr.val1    arr.val2     
1       a           x    
        b           null     
        null        null       

如您所见-通过这种方式-您甚至可以将两个元素都设置为NULL