Google analytics 通过BigQuery访问Firebase封闭漏斗中的结构和数组
本周我偶然发现了这个标准的SQL BigQuery,这让我从Firebase Analytics封闭式漏斗开始。然而,我得到了错误的结果(查看下图)。在用户没有首先开始“教程\u Lesson Started>>Lesson=1”之前,不应该有“教程\u Lesson Completed”的用户。这可能是由于各种原因 问题:Google analytics 通过BigQuery访问Firebase封闭漏斗中的结构和数组,google-analytics,google-bigquery,firebase-analytics,Google Analytics,Google Bigquery,Firebase Analytics,本周我偶然发现了这个标准的SQL BigQuery,这让我从Firebase Analytics封闭式漏斗开始。然而,我得到了错误的结果(查看下图)。在用户没有首先开始“教程\u Lesson Started>>Lesson=1”之前,不应该有“教程\u Lesson Completed”的用户。这可能是由于各种原因 问题: 使用User属性=“first\u open\u time”明智吗?还是使用Event=“first\u open”更好。后一种实现是什么样子的 我怀疑我可能没有正确地深入
#standardSQL
SELECT
step1, step2, step3, step4, step5, step6,
COUNT(*) AS funnel_count,
COUNT(DISTINCT user_id) AS users
FROM (
SELECT
user_dim.app_info.app_instance_id AS user_id,
event.timestamp_micros AS event_timestamp,
event.name AS step1,
LEAD(event.name, 1) OVER (
PARTITION BY user_dim.app_info.app_instance_id
ORDER BY event.timestamp_micros ASC) as step2,
LEAD(event.name, 2) OVER (
PARTITION BY user_dim.app_info.app_instance_id
ORDER BY event.timestamp_micros ASC) as step3,
LEAD(event.name, 3) OVER (
PARTITION BY user_dim.app_info.app_instance_id
ORDER BY event.timestamp_micros ASC) as step4,
LEAD(event.name, 4) OVER (
PARTITION BY user_dim.app_info.app_instance_id
ORDER BY event.timestamp_micros ASC) as step5,
LEAD(event.name, 5) OVER (
PARTITION BY user_dim.app_info.app_instance_id
ORDER BY event.timestamp_micros ASC) as step6
FROM
`......`,
UNNEST(event_dim) AS event,
UNNEST(user_dim.user_properties) AS user_prop
WHERE user_prop.key = "first_open_time"
ORDER BY 1, 2, 3, 4, 5 ASC
)
WHERE step6 = "Tutorial_LessonStarted" AND EXISTS (
SELECT *
FROM `......`,
UNNEST(event_dim) AS event,
UNNEST(event.params)
WHERE key = 'LessonNumber' AND value.string_value = "lesson1") GROUP BY step1, step2, step3, step4, step5, step6
ORDER BY funnel_count DESC
LIMIT 100;
project\u id.com\u game\u example\u IOS.app\u events\u 20170212
- View.OnBoardingWelcome页面
- View.OnboardingFinalPage
- View.JamLoading
- View.JamLoading
- Jam.UserViewsJam
- Jam.ProjectOpened
- View.jammiler
- Tutorial.lessonstart(此参数“LessonNumber”的值将等于“lesson1”)
- Jam.projectplay已启动
- View.jamloop选择器
- View.JamMixer
- View.jamloop选择器
- View.JamMixer
- View.jamloop选择器
- View.JamMixer
- 教程.第二课已完成
- Tutorial.lessonstart(此参数“LessonNumber”的值将等于“lesson2”)
让我来解释一下,然后看看我是否可以提出一个问题让你开始 看起来您想分析分析数据中的事件序列,但序列已经在那里了--您有一个事件数组。查看,
event\u dim
是相关列,除非我误解了什么,否则这些事件是按时间排序的。如果您想检查第六个事件的名称如果是,您可以使用:
event_dim[SAFE_ORDINAL(6)].name
如果事件少于六个,则计算结果将为NULL
,否则它将为您提供带有事件名称的字符串
另一个观察结果是,您正在尝试分析事件dim
和用户dim
,但您将取两者的叉积,这将导致行数爆炸,并使查询结果难以推理。要查找特定的用户属性,请使用以下形式的表达式:
(SELECT value.value.string_value
FROM UNNEST(user_dim.user_properties)
WHERE key = 'first_open_time') = '<expected property value>'
使用括号操作符访问事件\u dim
中的步骤,我们可以执行以下操作:
FROM `project_id.com_game_example_IOS.app_events_*`
WHERE _TABLE_SUFFIX = '20170701' AND
event_dim[SAFE_ORDINAL(6)].name = 'Tutorial_LessonStarted' AND
(SELECT value.value.string_value
FROM UNNEST(user_dim.user_properties)
WHERE key = 'first_open_time') = '<expected property value>'
WITH FilteredInput AS (
SELECT *
FROM `project_id.com_game_example_IOS.app_events_*`
WHERE _TABLE_SUFFIX = '20170701' AND
event_dim[SAFE_ORDINAL(6)].name = 'Tutorial_LessonStarted' AND
(SELECT value.value.string_value
FROM UNNEST(user_dim.user_properties)
WHERE key = 'first_open_time') = '<expected property value>' AND
-- ensure that an event with lesson1 precedes Tutorial_LessonStarted
EXISTS (
SELECT 1
FROM UNNEST(event_dim) WITH OFFSET event_offset
CROSS JOIN UNNEST(params)
WHERE key = 'LessonNumber' AND
value.string_value = 'lesson1' AND
event_offset < 5
)
)
SELECT
event_dim[ORDINAL(1)].name AS step1,
event_dim[ORDINAL(2)].name AS step2,
event_dim[ORDINAL(3)].name AS step3,
event_dim[ORDINAL(4)].name AS step4,
event_dim[ORDINAL(5)].name AS step5,
event_dim[ORDINAL(6)].name AS step6,
COUNT(*) AS funnel_count,
COUNT(DISTINCT user_dim.user_id) AS users
FROM FilteredInput
GROUP BY step1, step2, step3, step4, step5, step6;
将FilteredInput设置为(
挑选*
来自“project\u id.com\u game\u example\u IOS.app\u events”_*`
其中_TABLE_后缀='20170701'和
事件名称[安全顺序(6)]。名称='Tutorial\u LessonStarted'和
(选择value.value.string\u值
来自UNNEST(用户维度用户属性)
其中key='first\u open\u time')=''和
--确保第1课的活动在教程\u第1课开始之前
存在(
选择1
从UNNEST(事件\尺寸)到偏移事件\偏移
交叉连接未测试(参数)
其中key='LessonNumber'和
value.string_value='lesson1'和
事件u偏移量<5
)
)
挑选
事件名称[序号(1)]。名称为步骤1,
事件名称[序号(2)]。名称为步骤2,
事件名称[序号(3)]。名称为步骤3,
事件名称[序号(4)]。名称为步骤4,
事件名称[序号(5)]。名称为步骤5,
事件名称[序号(6)]。名称为步骤6,
计数(*)作为漏斗计数,
将(不同的用户\u dim.user\u id)计数为用户
从过滤器输入
按步骤1、步骤2、步骤3、步骤4、步骤5、步骤6分组;
这将返回所有唯一的“路径”以及每个用户的计数和不同用户数。请注意,我只是从头顶上写下这一点——我没有可以尝试的代表性数据——因此可能存在语法或其他错误。您能看到我对这个问题的回答是否有帮助吗?。它有一个为特定
ke检索字符串值的示例y
在选择列表中。你好,Elliot,谢谢你抽出时间回复,很抱歉我的评论被耽搁了。我已经根据你的反馈更新了上面的问题。我运行了代码,但没有收到任何输出。我只是不确定其中一段代码(我在上面的问题中提到)。这个查询背后的核心思想来自:“第2步:计算以消费虚拟货币结束的旅程的用户数”。让我知道你是否需要更多的澄清。再次感谢你的帮助:)这部分由事件dim[SAFE_ORDINAL(6)]建模。name='Tutorial_lessonstart'
在我的ans中