BigQuery UNNEST没有结果

时间:2017-07-11 10:39:27

标签: sql google-analytics google-bigquery unnest standard-sql

我对嵌套数据的概念比较陌生,并试图在BigQuery(https://support.google.com/analytics/answer/3437719?hl=en)中以正确的方式展示一些GA数据。

现在给出一些上下文,对于每个访问者会话,我试图捕获所查看的产品SKU列表(详细视图)以及是否存在事务,事务ID。通过我的计算,在做了一些研究之后,最简单的方法就是这样,使用LEFT JOINS来带回所有东西:

SELECT fullVisitorId as uId, visitId as vId, h.transaction.transactionId as 
trId, STRING_AGG(p.productSKU, "|") as skus
FROM
`test-bigquery.12345678.ga_sessions_*` t
  LEFT JOIN UNNEST(hits) h
  LEFT JOIN UNNEST(h.product) p
WHERE 
_TABLE_SUFFIX = '20170709'
AND h.eCommerceAction.action_type = '2'
GROUP BY uId, vId, trId

但是,这似乎返回零结果,其中trId不为null ....

然后,我将上述内容分成两个查询并加入。这似乎工作并返回一个看似合理的行数(~1000),其中trId不为空。

WITH skus AS
(SELECT fullVisitorId as uId, visitId as vId, STRING_AGG(p.productSKU, "|") as skus
    FROM
    `test-bigquery.12345678.ga_sessions_*` t
      LEFT JOIN UNNEST(hits) h
      LEFT JOIN UNNEST(h.product) p
    WHERE 
    _TABLE_SUFFIX = '20170709'
    AND h.eCommerceAction.action_type = '2'
    GROUP BY uId, vId),
transactions AS
  (SELECT fullVisitorId as uId_trans, visitId as vId_trans,  h.transaction.transactionId as trId
    FROM
    `test-bigquery.12345678.ga_sessions_*` t
      LEFT JOIN UNNEST(hits) h
    WHERE 
      _TABLE_SUFFIX = '20170709'
      AND h.transaction.transactionId IS NOT NULL
      GROUP BY uId_trans, vId_trans, trId)
SELECT skus.uId, skus.vId, transactions.trId, skus.skus
FROM skus
LEFT JOIN transactions ON transactions.vId_trans = skus.vId AND transactions.uId_trans = skus.uId

如果有人可以解释为什么两个人不会给出相同的答案并希望我能够参与未来各种嵌套乐趣,那将是非常棒的....谢谢!

1 个答案:

答案 0 :(得分:2)

你犯的错误发生在这一行:

AND h.eCommerceAction.action_type = '2'

如果您检查字段action_type的{​​{3}},则当客户看到产品时,您会看到其值为“2”,而当交易发生时,它的值为“6”。因此,如果您只筛选出等于'2'的操作,那么您将无法获得其值为“6”的交易。

在第二个查询中,请注意transactions的查询不再过滤掉操作为'2'的位置,而是trasactionId不为空的位置,以便您现在成功检索这些行。< / p>

仍有一些方法可以极大地优化您的查询,例如:

SELECT 
  fullvisitorid,
  visitid,
  ARRAY(SELECT STRUCT(prods.productsku AS sku, MAX(IF(hits.ecommerceaction.action_type = '6', hits.transaction.transactionID, NULL)) AS transactionID) FROM UNNEST(hits) hits, UNNEST(hits.product) prods WHERE hits.ecommerceaction.action_type IN ('2', '6') GROUP BY prods.productsku) result
FROM `test-bigquery.12345678.ga_sessions_*`
WHERE TRUE
  AND _TABLE_SUFFIX = '20170709'
  AND EXISTS(SELECT 1 FROM UNNEST(hits) hits WHERE hits.ecommerceaction.action_type IN ('2', '6'))
LIMIT 1000

此查询产生与您相同的结果,但它更简洁,性能更高(它避免了不必要的JOINUNNEST操作,并充分利用了ARRAYs和STRUCTs结构数据)。

我强烈建议您学习如何将这些技术用于嵌套数据,因为您可以在几秒钟内查询数百个千兆。这些是我在数据集中得到的结果:

ga sessions schema

它在15秒内处理了超过500Gbs。