Google analytics 通过BigQuery访问Firebase封闭漏斗中的结构和数组

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”更好。后一种实现是什么样子的 我怀疑我可能没有正确地深入

本周我偶然发现了这个标准的SQL BigQuery,这让我从Firebase Analytics封闭式漏斗开始。然而,我得到了错误的结果(查看下图)。在用户没有首先开始“教程\u Lesson Started>>Lesson=1”之前,不应该有“教程\u Lesson Completed”的用户。这可能是由于各种原因

问题:

  • 使用User属性=“first\u open\u time”明智吗?还是使用Event=“first\u open”更好。后一种实现是什么样子的
  • 我怀疑我可能没有正确地深入到:事件(String=“Tutorial\u lessonstart”)>>参数(String=“LessonNumber”)>>值(String=“lesson1”)
  • 在_TABLE_SUFFIX='20170701'上的过滤器可能如何工作,我知道这会更便宜。任何优化的代码建议都会得到热烈的欢迎和投票

    #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
  • 我遗漏了漏斗计数和用户计数 输出:

    ---------------------------------------------------------- 自上述原始问题以来的更新:

    @埃利奥特:我不明白你为什么说:--确保在教程开始之前有一个第1课的活动

    教程\u LessonStart有一个参数“LessonNumber”,其值为lesson1、lesson2、lesson3、lesson4

    我想计算漏斗中最后一步等于LessonNumber=lesson1时发生的所有漏斗

    因此,应用于一个全新用户的第一次会话的事件日志数据(aka:first_open_time启动的用户),答案如下表所示:

    • 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中