给出以下查询(非常简化):
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”的页面。
我知道查询确实会返回预期的输出,但是我的主要问题(纯粹是为了理解为什么该查询不起作用)实际上更多:为什么此查询不能按预期工作?
谢谢!
答案 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')