自上次会话以来的天数 - 适用于具有会话级自定义维度的用户 - BigQuery - Google Analytics

时间:2017-10-17 10:49:07

标签: sql google-analytics google-bigquery

我从Lunametrics博客获得了以下SQL查询。工作良好。但是,我希望能够做的是有一个额外的列显示会话级自定义变量的值。

我现在拥有的是:

SELECT
  fullvisitorid,
  visitId,
  DATEDIFF(SEC_TO_TIMESTAMP(visitStartTime), 
SEC_TO_TIMESTAMP(prevVisitStartTime)) AS daysSinceLastSession,
 FLOOR((visitStartTime - prevVisitStartTime)/60) as minutesSinceLastSession
FROM (
 SELECT
fullvisitorid,
visitId,
visitStartTime,
LAG(visitStartTime) OVER (PARTITION BY fullvisitorid ORDER BY visitStartTime 
ASC) AS prevVisitStartTime
FROM
TABLE_DATE_RANGE([DATA],
TIMESTAMP ('2017-04-01'),
TIMESTAMP ('2017-04-08')))

我一直试图为索引为30的自定义维度引入一列,但没有成功。基本上,我只是希望能够看到自上次会话以来包含此自定义维度的访问者的日子。我的代码是:

max(case when hits.customdimensions.index = 30 then hits.customdimensions.value end) customerId

编辑:这显示我认为我可以将此自定义维度作为新列引入,但不起作用。

 SELECT
 fullvisitorid,
 max(case when hits.customdimensions.index = 30 then 
hits.customdimensions.value end) customerId,
 visitId,
 DATEDIFF(SEC_TO_TIMESTAMP(visitStartTime), 
 SEC_TO_TIMESTAMP(prevVisitStartTime)) AS daysSinceLastSession,
 FLOOR((visitStartTime - prevVisitStartTime)/60) as minutesSinceLastSession
 FROM (
 SELECT
    fullvisitorid,
    max(case when hits.customdimensions.index = 30 then 
    hits.customdimensions.value end) customerId,
    visitId,
    visitStartTime,
    LAG(visitStartTime) OVER (PARTITION BY fullvisitorid ORDER BY 
    visitStartTime ASC) AS prevVisitStartTime,



   FROM
   TABLE_DATE_RANGE([DATA],
   TIMESTAMP ('2017-04-01'),
   TIMESTAMP ('2017-04-08')))

感激地收到任何建议。

1 个答案:

答案 0 :(得分:0)

MAX是一个聚合函数 - 您必须以某种方式对其进行分组,无论是在整个表格中GROUP BY还是在行内,例如使用WITHIN RECORDWITHIN hits

要获得MAX( IF(hits.customdimensions.index = 30,hits.customdimensions.value,NULL) ) WITHIN RECORD

所需的每个会话的自定义维度值

这一行首先为每个会话(RECORD)和customDimension生成一个值列表 - 如果index为30且为NULL,则为值: MAX(NULL, NULL, NULL, ..., <value for hits.cd30>, ... , NULL, NULL, ... <another hits.cd30>, ... , NULL)

NULL是最低可能值。字符串按字母顺序排序(实际上是按代码表排序,但它们包含按字母顺序排序的字符) - 因为您在会话级别聚合命中级别customDimensions,您的列表可能包含多个非空值,用于具有多个匹配的会话,因为可能有多个cd30。 MAX()会返回字母表中最新的那个:"aab" < "aac" < "b"