Google analytics 从BigQuery中的Analytics查询聚合点击和会话数据

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

在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 = "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)