Google analytics 从BigQuery中的Analytics查询聚合点击和会话数据
在Google Analytics BigQuery中,以下查询尝试在Google analytics 从BigQuery中的Analytics查询聚合点击和会话数据,google-analytics,google-bigquery,Google Analytics,Google Bigquery,在Google Analytics BigQuery中,以下查询尝试在会话和点击次数级别聚合信息 SELECT visitId, trafficSource.source as source, trafficSource.medium as medium, device.browser as browser, min(hits.hour) as firstHitHour, boolean(count(hits.eventInfo.eventCategory = "Some
会话
和点击次数
级别聚合信息
SELECT
visitId,
trafficSource.source as source,
trafficSource.medium as medium,
device.browser as browser,
min(hits.hour) as firstHitHour,
boolean(count(hits.eventInfo.eventCategory = "SomeValue")) as hasSomeValue
FROM
[my-table.ga_sessions_20150216]
GROUP BY
visitId, source, medium, browser;
如果在一行会话的所有点击中,至少有一次点击的hits.eventInfo.eventCategory
等于SomeValue
,则作为hasSomeValue的行boolean(count(count(hits.eventInfo.eventCategory=“SomeValue”)
预期结果如下所示:
sessionId source medium browser firstHitHour hasSomeValue
--------------------------------------------------------------------------------------
12318 google cpc firefox 12 true
13317 google organic safari 14 null
13551 bing organic firefox 14 true
13610 orange display chrome 14 true
14381 stackoverflow referral safari 15 false
14422 google organic chrome 15 true
然而,上面提到的线路似乎不起作用。即使我输入了一些哑值,例如hits.eventInfo.eventCategory=“blabla”
,它仍然会为某些行输出true
(显然,没有任何命中具有此哑值)
实际上,指令count(hits.eventInfo.eventCategory=“blablabla”)
-不带boolean()
返回看似随机的结果(与实际计数没有任何共同之处)
这一行应该是什么来触发正确的输出?您将更容易使用。要检查hits
中是否存在值,请在其上使用EXISTS
子句。比如说,
SELECT
visitId,
trafficSource.source as source,
trafficSource.medium as medium,
device.browser as browser,
(SELECT MIN(hour) FROM UNNEST(hits)) as firstHitHour,
EXISTS (SELECT 1 FROM UNNEST(hits) WHERE eventInfo.eventCategory = "SomeValue") as hasSomeValue
FROM
`my-table.ga_sessions_20150216`
GROUP BY
visitId, source, medium, browser;
另请参见上的指南
如果您确实想继续使用传统SQL,则需要在记录中使用
,并结合点击次数的计数使用,这样使用起来会更方便。要检查hits
中是否存在值,请在其上使用EXISTS
子句。比如说,
SELECT
visitId,
trafficSource.source as source,
trafficSource.medium as medium,
device.browser as browser,
(SELECT MIN(hour) FROM UNNEST(hits)) as firstHitHour,
EXISTS (SELECT 1 FROM UNNEST(hits) WHERE eventInfo.eventCategory = "SomeValue") as hasSomeValue
FROM
`my-table.ga_sessions_20150216`
GROUP BY
visitId, source, medium, browser;
另请参见上的指南
如果您确实想继续使用传统SQL,则需要在记录中使用
与命中次数的计数结合使用我找到了一种输出所需结果的方法,使用some()
而不是布尔值(count())
我不太清楚为什么boolean(count())
会触发意外结果。我找到了一种输出所需结果的方法,使用some()
而不是boolean(count())
我不太清楚为什么boolean(count())
会触发意外结果。请尝试下面的方法
#standardSQL
SELECT
visitId, source, medium, browser,
MIN(hour) AS firstHitHour,
LOGICAL_OR(hasValue) AS hasValue
FROM (
SELECT
visitId,
trafficSource.source AS source,
trafficSource.medium AS medium,
device.browser AS browser,
h.hour AS hour,
EXISTS(SELECT 1 FROM UNNEST(hits) WHERE eventInfo.eventCategory = "SomeValue") AS hasValue
FROM
`my-table.ga_sessions_20161122`, UNNEST(hits) AS h
)
GROUP BY
visitId, source, medium, browser;
试试下面
#standardSQL
SELECT
visitId, source, medium, browser,
MIN(hour) AS firstHitHour,
LOGICAL_OR(hasValue) AS hasValue
FROM (
SELECT
visitId,
trafficSource.source AS source,
trafficSource.medium AS medium,
device.browser AS browser,
h.hour AS hour,
EXISTS(SELECT 1 FROM UNNEST(hits) WHERE eventInfo.eventCategory = "SomeValue") AS hasValue
FROM
`my-table.ga_sessions_20161122`, UNNEST(hits) AS h
)
GROUP BY
visitId, source, medium, browser;
首先,使用boolean(count(hits.eventInfo.eventCategory=“SomeValue”)
的问题是,如果hits.eventInfo.eventCategory有任何非空值(或“SomeValue”或其他不同值),它将返回true
,而只有当hits.eventInfo.eventCategory的所有值都为空时,它才会返回false
。但这并非意外的结果:
使用hits.eventInfo.eventCategory=“SomeValue”
,BQ根据预期条件为每个命中分配true
或false
,如果该命中具有NULL
值,则分配NULL
但是,由于count
“返回函数范围内非空值的总数”,因此使用count(hits.eventInfo.eventCategory=“SomeValue”)
(按visitId分组)BQ返回之前获得的真
和假
的合计数,并且仅当给定visitId的所有命中数null
时返回0。换句话说,它统计所有的非空值,而不仅仅是那些满足条件的值,所以查询的问题就在这里
boolean(…)
按预期工作:如果最后一个表达式不为0且不为NULL,则返回true;如果为0,则返回false;如果为NULL,则返回NULL(不会获得任何NULL)
第二,正如您在上一篇评论中所说,您可以使用some()
而不是boolean(count())
,但请注意,使用它不会获得任何null
结果,正如您在提供的示例中最初所希望的那样。如果至少有一个hits.eventInfo.eventCategory等于“SomeValue”,则将获得true
,否则将获得false
。如果这对你合适,我认为这是最好的选择
但是,如果您希望在会话的所有命中都为null hits.eventInfo.eventCategory时获得null
,则可以使用:
SELECT
visitId,
trafficSource.source as source,
trafficSource.medium as medium,
device.browser as browser,
min(hits.hour) as firstHitHour,
boolean(MAX(
CASE WHEN hits.eventInfo.eventCategory = "SomeValue" THEN 1
WHEN hits.eventInfo.eventCategory != "SomeValue" THEN 0
ELSE null END
)
) as hasSomeValue
FROM
[my-table.ga_sessions_20150216]
GROUP BY
visitId, source, medium, browser
首先,如果条件满足,我们为每个命中指定1,如果条件不满足,则指定0,如果值为null,则指定null。其次,通过询问max()
,如果至少有一个“SomeValue”,我们将得到1;如果有非空值但所有值都与“SomeValue”不同,则得到0;如果所有点击的hits.eventInfo.eventCategory
的值都为null,则得到null。最后,我们使用boolean()
来获得true
、false
或null
,具体取决于每种情况。首先,使用boolean(count(hits.eventInfo.eventCategory=“SomeValue”)
的问题是,如果hits.eventInfo.eventCategory有任何非空值(或“SomeValue”或另一个不同的值),只有当hits.eventInfo.eventCategory的所有值都为null时,它才会返回false
。但这不是意外的结果:
使用hits.eventInfo.eventCategory=“SomeValue”
,BQ根据预期条件为每个命中分配true
或false
,如果该命中具有NULL
值,则分配NULL
但是,由于count
使用count(hits.eventInfo.eventCategory=“SomeValue”)
(按visitId分组)返回函数范围内非空值的总数BQ返回以前获得的true
和false
的合计数,并且仅当给定visitId的所有命中数null
时才返回0。换句话说,它统计所有非null值,而不仅仅是那些满足条件的值,因此您的查询问题就在这里
boolean(…)
按预期工作:如果最后一个表达式不为0且不为NULL,则返回true;如果为0,则返回false;如果为NULL,则返回NULL(yo)