Google analytics 大查询-谷歌分析-首次访问和购买之间的时间差
正在尝试获取列表: visitorid、首次访问时间、发生事务的命中时间 我写的只是获取有交易收入的行。我还试图通过date(visitStartTime)将visitStartTime(unix日期)转换为常规日期,但由于输出的日期,这在group by中失败 任何方向都非常有用Google analytics 大查询-谷歌分析-首次访问和购买之间的时间差,google-analytics,google-bigquery,Google Analytics,Google Bigquery,正在尝试获取列表: visitorid、首次访问时间、发生事务的命中时间 我写的只是获取有交易收入的行。我还试图通过date(visitStartTime)将visitStartTime(unix日期)转换为常规日期,但由于输出的日期,这在group by中失败 任何方向都非常有用 SELECT fullvisitorID, visitNumber, visitStartTime, hits.transaction.transactionRevenue FROM [7
SELECT
fullvisitorID,
visitNumber,
visitStartTime,
hits.transaction.transactionRevenue
FROM
[75718103.ga_sessions_20150310],
[75718103.ga_sessions_20150309],
[75718103.ga_sessions_20150308],
[75718103.ga_sessions_20150307],
[75718103.ga_sessions_20150306],
[75718103.ga_sessions_20150305],
[75718103.ga_sessions_20150304],
[75718103.ga_sessions_20150303],
[75718103.ga_sessions_20150302],
WHERE totals.transactions >=1
GROUP BY
fullvisitorID, visitNumber, visitStartTime, hits.transaction.transactionRevenue;
visitStartTime在Google Analytics模式中定义为POSIX时间,表示自epoch以来的秒数。BigQuery时间戳编码为自纪元起的micro秒数。因此,为了将开始时间作为时间戳,我使用了
TIMESTAMP(integervistarttime*1000000))
。hits.time包含自第一次命中以来的毫秒数,因此要获得事务的时间,需要将它们乘以1000以获得微秒的粒度,因此时间戳(整数(visitStartTime*1000000+hits.time*1000))
。由于点击是重复记录,不需要分组,因此数据模型已经将所有点击分组在一起。
总而言之:
SELECT
fullVisitorId,
timestamp(integer(visitStartTime*1000000)) as start_time,
timestamp(integer(visitStartTime*1000000 + hits.time*1000)) as transaction_time
FROM
[google.com:analytics-bigquery:LondonCycleHelmet.ga_sessions_20130910]
WHERE hits.transaction.transactionRevenue > 0
Mosha的解决方案简单而优雅,但太简单了,实际上它计算了第一次页面浏览和一次访问中的每个事务之间的时间,因此它不计算一个访问者的第一次访问和第一次事务之间的时间。因此,如果使用Mosha的查询计算平均时间,则为1.33分钟。但如果使用我创建的查询,则需要9.91分钟。我的SQL技能已经很不成熟了,所以可能还可以改进 Masha的查询(第一次页面浏览和一次访问中的每笔交易之间的平均时间): 我的查询(一位访客第一次访问和第一次交易之间的平均时间): 我留下了一些额外的字段,因此如果不使用第一次选择,您可以看到一些有趣的数据
Ps:感谢Mosha演示如何计算时间。对于日期,只需在外部查询中执行即可。基本上保留您的查询,但将其包装为“从(您的查询)中选择日期(visitStartTime)”。对于另一个问题。。。什么意思?它不会返回“transactionRevenue”为null的行?是的,该查询只返回会话中产生收入的visitorIDs和VisitNumber。我希望得到第一次治疗(其中visitNumber=1和任何有销售的会话…,无论是第一个会话还是第n个会话。但我还需要每个会话的相应日期。这是一个有趣的问题。第一次访问一直都有
点击次数。time=0
。试图确保我正确理解这一点:在这个问题中,第一次访问时间
指的是会话的开始,对吗?或者这是用户在可能更早的会话中第一次访问的时间。谢谢Mosha-看看,看看它是否签出!
SELECT ROUND(AVG(MinutesToTransaction),2) AS avgMinutesToTransaction FROM (
SELECT
fullVisitorId,
timestamp(integer(visitStartTime*1000000)) as start_time,
timestamp(integer(visitStartTime*1000000 + hits.time*1000)) as transaction_time,
ROUND((TIMESTAMP_TO_SEC(timestamp(integer(visitStartTime*1000000 + hits.time*1000))) - TIMESTAMP_TO_SEC(timestamp(integer(visitStartTime*1000000)) )) / 60, 2) AS MinutesToTransaction
FROM
[google.com:analytics-bigquery:LondonCycleHelmet.ga_sessions_20130910]
WHERE hits.transaction.transactionRevenue > 0
)
SELECT ROUND(AVG(MinutesToTransaction),2) AS avgMinutesToTransaction FROM (
SELECT firstInteraction.fullVisitorId,
MIN(firstInteraction.visitId) AS firstInteraction.visitId,
TIMESTAMP(INTEGER(MIN(firstInteraction.visitStartTime)*1000000)) AS timeFirstInteraction,
firstTransaction.visitId,
firstTransaction.timeFirstTransaction,
FIRST(BOOLEAN(firstInteraction.visitId = firstTransaction.visitId)) AS transactionInFirstVisit,
ROUND((TIMESTAMP_TO_SEC(firstTransaction.timeFirstTransaction) - TIMESTAMP_TO_SEC(TIMESTAMP(INTEGER(MIN(firstInteraction.visitStartTime)*1000000)))) / 60, 2) AS MinutesToTransaction
FROM [google.com:analytics-bigquery:LondonCycleHelmet.ga_sessions_20130910] firstInteraction
INNER JOIN (
SELECT
fullVisitorId,
visitId,
TIMESTAMP(INTEGER(MIN(visitStartTime*1000000 + hits.time*1000))) AS timeFirstTransaction
FROM [google.com:analytics-bigquery:LondonCycleHelmet.ga_sessions_20130910]
WHERE hits.type = "TRANSACTION"
GROUP BY 1, 2
) AS firstTransaction
ON firstInteraction.fullVisitorId = firstTransaction.fullVisitorId
GROUP BY 1, 4, 5
)