我已经编写了一个标准SQL查询来从BigQuery中提取一些Google Analytics数据。我在下面粘贴了一个用于测试的简化版本:
SELECT COUNT(DISTINCT(session_id))
FROM (
SELECT
CONCAT(CAST(fullVisitorId AS STRING), '.', CAST(visitStartTime AS STRING)) AS session_id
FROM `myproject.ga_sessions_20180227`, UNNEST(hits) AS hits
);
运行此查询会输出6,696的唯一会话计数,与GA UI相比,这是准确的。
但是,当我将customDimensions引入查询时,我会丢失许多行。运行此查询仅输出6,606个唯一会话。
SELECT COUNT(DISTINCT(session_id))
FROM (
SELECT
CONCAT(CAST(fullVisitorId AS STRING), '.', CAST(visitStartTime AS STRING)) AS session_id,
MAX(IF(customs.index = 14, customs.value, NULL)) AS custom_id
FROM `myproject.ga_sessions_20180227`, UNNEST(customDimensions) AS customs
GROUP BY fullVisitorId, visitStartTime
);
我没有使用 hits.customDimensions ,因为相关的自定义维度是基于用户级别,而不是命中级别。如果我不对输出进行分组,则会出错。
如何在不丢失行的情况下取消基于非命中的自定义维度?
答案 0 :(得分:2)
问题是CROSS JOIN
(逗号):当使用NULL
交叉加入表格时 - 或者在这种情况下为空的customDimensions - 结果总共为NULL
而不是仅左边的桌子。
您希望使用LEFT JOIN
代替CROSS JOIN
,因为这会保留左表:
FROM `table` LEFT JOIN customDimensions AS cd
除此之外,您还可以使用简单的子选择而不是连接子表/数组:
SELECT
(SELECT value FROM t.customDimensions WHERE index=1) AS cd1
, COUNT(1) AS Qty
FROM `project.dataset.ga_sessions_20180202` AS t
GROUP BY 1