BigQuery:筛选表后出现意外结果

时间:2019-01-25 10:14:47

标签: google-analytics google-bigquery

给出以下查询(非常简化):

SELECT hits.page.pagepath AS Page
FROM
    `[projectid].[datasetid].ga_sessions_*` t, t.hits as hits
  WHERE
  _TABLE_SUFFIX BETWEEN '20190123' AND '20190123' 
  AND (SELECT COUNT(*)>0 FROM t.hits WHERE REGEXP_CONTAINS(hits.page.pagepath,r'dames'))

我希望此查询仅返回包含“ dames”的页面,但实际上并非如此。在“ WHERE”部分使用此过滤器。

(SELECT COUNT(*)>0 FROM t.hits WHERE REGEXP_CONTAINS(hits.page.pagepath,r'dames'))

..那里在命中级别上是扁平化的,仅在网页页面上被过滤。在主查询中,命中级别也保持不变。因此,我希望每次命中都会有TRUE和FALSE,而最终数据集中只有TRUE保留,即仅包含“ dames”的页面。

我知道查询确实会返回预期的输出,但是我的主要问题(纯粹是为了理解为什么该查询不起作用)实际上更多:为什么此查询不能按预期工作?

谢谢!

1 个答案:

答案 0 :(得分:0)

您必须了解,将未嵌套的数组与其父行交叉连接不会完全平整源表。它为数组中的每一行重复父行:在这种情况下,每次点击都会重复每个会话信息:hits数组本身也是如此!

这意味着您可以在整个会话中针对每次匹配查找内容,因为对于每次匹配,所有匹配都可用,因为它们也会重复出现。

您正在WHERE子句中访问此重复的匹配数组。

您不想在该重复的数组上写子选择,而是要使用该数组中新可用的交叉联接字段,即AND REGEXP_CONTAINS(hits.page.pagepath,r'dames')

在您的情况下,这可能会有些混乱,因为平整匹配的别名也是匹配-您可能需要考虑将其重命名为类似h之类的东西,因此您的无效查询看起来像这样< / p>

SELECT h.page.pagepath AS Page
FROM
    `[projectid].[datasetid].ga_sessions_*` t, t.hits as h
  WHERE
  _TABLE_SUFFIX BETWEEN '20190123' AND '20190123' 
  AND (SELECT COUNT(*)>0 FROM t.hits h2 WHERE REGEXP_CONTAINS(h.page.pagepath,r'dames'))

您要检查每个页面的整个会话是否包含满足您条件的页面。

工作示例为

SELECT h.page.pagepath AS Page
FROM
    `[projectid].[datasetid].ga_sessions_*` t, t.hits as h
  WHERE
  _TABLE_SUFFIX BETWEEN '20190123' AND '20190123' 
  AND REGEXP_CONTAINS(h.page.pagepath,r'dames')