谷歌分析会话范围的字段返回多个值

Posted

技术标签:

【中文标题】谷歌分析会话范围的字段返回多个值【英文标题】:Google Analytics session-scoped fields returning multiple values 【发布时间】:2018-02-05 17:16:17 【问题描述】:

我发现 BigQuery 中的某些 GA“会话”范围字段具有相同 fullVisitorIdvisitId 字段的多个值。请参见下面的示例:

对字段进行分组也无济于事。在 GA 中,我检查了用户数量与不同设备划分的用户数量。用户数不同:

这解释了发生了什么,用户将被分组到多个设备下。我的结论是,在用户会话期间的某个时间点,他们的浏览器用户代理发生了变化,在随后的点击中,GA 中设置了新的设备类型。

我希望 GA 使用第一个或最后一个值来避免这种情况,但我猜他们不会。我的问题是,如果我接受这是 GA 中的“缺陷”。我宁愿选择一个值。从以下查询中选择最后一个或第一个设备值的最佳方法是什么:

SELECT
  fullVisitorId,
  visitId,
  device.deviceCategory
FROM (
  SELECT
    *
  FROM
    `project.dataset.ga_sessions_*` desktop
  UNION ALL
  SELECT
    *
  FROM
    `project.dataset.ga_sessions_*` mobile ) table

我尝试进行子选择并使用STRING_AGG(),尝试按hits.time 排序并限制为一个值,但仍会创建另一行。

我已经测试,发现以下字段都有相同的问题:

visitNumber
totals.hits
totals.pageviews
totals.timeOnSite
trafficSource.campaign
trafficSource.medium
trafficSource.source
device.deviceCategory
totals.sessionQualityDim
channelGrouping
device.mobileDeviceInfo
device.mobileDeviceMarketingName
device.mobileDeviceModel
device.mobileInputSelector
device.mobileDeviceBranding

更新

请参阅以下有关此特定 fullVisitorIdvisitId 的查询 - UNION 已被删除:

visitStartTime 补充说:

visitStartTimehits.time 添加:

【问题讨论】:

这里有适合您的解决方案... 【参考方案1】:

嗯,从表面上看,我认为你有 3 个选择:

1 - 按 fullVisitorId、visitId 分组;并使用 Max 或 MIN deviceCategory。这应该可以防止设备切换器被重复计算,这有点随意,但 GA 数据也是如此。

2 - 选项 2 类似,但如果 deviceCategory 结果可以是任何内容(即结果中不限于有效的 deviceCategory 成员),您可以使用 CASE 检查 MAX(deviceCategory) = MIN(deviceCategory ) 如果它们不同,则返回 'Multiple Devices'

3 - 您可以更进一步,计算使用的不同设备的数量,构建以某种方式列出它们的串联,等等。

我要为你写第二个。在您的问题中,您有 2 个不同的查询:一个有 [date],一个没有 - 我会同时提供。

没有[日期]:

SELECT
    fullVisitorId,
    visitId,
    case when max(device.deviceCategory) = min(device.deviceCategory) 
       then max(device.deviceCategory) 
       else 'Multiple Devices' 
    end as deviceCategory,
    metric aggregations here
FROM 
    (SELECT *
        FROM `project.dataset.ga_sessions_*` desktop
    UNION ALL
    SELECT *
        FROM `project.dataset.ga_sessions_*` mobile 
    ) table
GROUP BY fullVisitorId, visitId

与[日期]:

SELECT
    [date],
    fullVisitorId,
    visitId,
    case when max(device.deviceCategory) = min(device.deviceCategory) 
       then max(device.deviceCategory) 
       else 'Multiple Devices' 
    end as deviceCategory,
    metric aggregations here
FROM 
    (SELECT *
        FROM `project.dataset.ga_sessions_*` desktop
    UNION ALL
    SELECT *
        FROM `project.dataset.ga_sessions_*` mobile 
    ) table
GROUP BY [date], fullVisitorId, visitId

我在这里假设您提供的 Selects 和 Union 是正确的。

另外,我应该指出,那些 metric aggregations 应该是 SUM 以外的东西,否则你仍然会重复计算。

我希望这会有所帮助。

【讨论】:

这很有帮助,谢谢。我会明确地将它用于其他一些类似这样的领域。进一步查看 device.deviceCategoery,我发现当我还包括“hits.time”(时间戳 - 命中级别字段)时,用户设备会发生变化。理想情况下,我希望能够根据他们在该会话中的第一次点击或最后一次点击显示第一个。 @MeisamEbrahimi - ...如果答案适合您,请不要忘记“接受”它。谢谢。 @MeisamEbrahimi - 我添加了关于指标聚合的注释。如果它对您有用,请不要忘记“接受”答案。谢谢 @MeisamEbrahimi - 自您的上一条消息以来,我对您的 Google Analytics(分析)解决方案做了一些补充。您应该看一下 - 如果它对您有帮助,请不要忘记“接受”答案。谢谢。 @MeisamEbrahimi - 只是想知道你是否尝试过这个解决方案,因为我做了所有的补充。我希望它对你有用。如果确实如此,请不要忘记“接受”它作为答案。谢谢【参考方案2】:

这个字段的一行不可能有两个值,因为它只能包含一个值。

有两种可能:

    您实际上是在查询两个单独的数据集/两个不同的视图 - 这在示例代码中并不清晰可见。客户端 ID (=fullvisitorid) 仅对每个属性(跟踪 ID,UA-xxxxx 内容)唯一。如果您从不同的属性查询两个不同的视图,您必须期望获得两次使用的相同 ID。

    鉴于它们来自一个属性,这两行实际上可能是午夜拆分的一个会话,这意味着 visitId 保持不变,但 visitStartTime 会发生变化。但这也意味着设备类型的决策算法同时发生了变化……这很奇怪。

尝试使用 visitStartTime 看看会发生什么。 如果您使用两个不同的属性,请使用用户 ID 通过添加常量来组合或分离会话 - 您不能将它们组合起来。 SELECT 'property_A' AS constant FROM ...

【讨论】:

请查看我上面更新的帖子 - 我删除了 UNION,因为它与这个问题无关,它只是来自一种观点。似乎每个设备的 visitStartTime 和 hits.time 都是重复的 另外,我完全同意你的看法,这根本不应该发生。会话的整个想法是在行中为该字段类型设置一个值。我添加了列以查看是否有任何方法可以区分这些行,但我什么也没找到。我什至添加了命中范围的自定义维度,即使这样,平板电脑和移动设备也会出现每个值。这让我完全困惑,我怀疑某处存在错误。 它可能是一个汇总属性吗? 对不起,这是错误的,它不是一个汇总属性,它已链接到一个汇总属性。在 BigQuery 中,查询是在此属性上完成的,它不是汇总属性。 现在我没有想法了 :) 我会在这个时候联系支持。

以上是关于谷歌分析会话范围的字段返回多个值的主要内容,如果未能解决你的问题,请参考以下文章

刷新页面后,会话范围的 selectOneMenu 值更改回默认值 [重复]

谷歌分析,会话计数

会话持续时间 - 谷歌分析和 Firebase 报告之间的巨大差异

HTTP 会话的范围是啥?

页面共享数据的有效范围

Spring启动 - 会话作用域组件的setter不能使用单件服务 - 字段为空