Google Analytics会话范围字段返回多个值

时间:2018-02-05 17:16:18

标签: sql google-analytics google-bigquery

我发现有某些GA"会话" BigQuery中的范围字段,具有相同fullVisitorIdvisitId字段的多个值。请参阅以下示例:

example showing in the same session, the user has two different devices

对字段进行分组也没有帮助。在GA中,我检查了用户数量与不同设备分割的用户数量。用户数不同:

users number mismatch in 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补充道: visitStartTime added

visitStartTimehits.time添加了: visitStartTime and hits.time added

2 个答案:

答案 0 :(得分:2)

嗯,从外观上看,我认为你有3种选择:

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

2 - 选项二是相似的但是,如果deviceCategory结果可以是任何东西(即结果中没有约束到只有有效的deviceCategory成员),你可以使用CASE来检查MAX(deviceCategory)= MIN(deviceCategory )如果它们不同,则返回“多个设备”

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

我打算给你写第2号。在您的问题中,您有两个不同的查询:一个有[日期],一个没有 - 我会同时提供。

没有[日期]:

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

使用[date]:

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

我在这里假设您提供的选择和联盟是合理的。

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

我希望这会有所帮助。

答案 1 :(得分:0)

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

有两种可能性:

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

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

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

    HTH