【问题标题】:Getting users who installed and uninstalled app on same day with time taken for uninstall in BigQuery在 BigQuery 中获取在同一天安装和卸载应用程序的用户以及卸载时间
【发布时间】:2021-01-06 00:16:21
【问题描述】:

我在 BigQuery 中编写了一个查询,以获取在同一天执行 app_remove 和 first_open 的用户,但我没有得到想要的输出:

SELECT
extract(time from TIMESTAMP_MICROS(event_timestamp)) as Time,
extract(date from TIMESTAMP_MICROS(event_timestamp)) as Date,
user_pseudo_id,
event_name
FROM
  `mybits-54f8c.analytics_179636122.events_20200917`
WHERE (event_name = "app_remove" or event_name = "first_open")
ORDER BY user_pseudo_id, Date, Time

输出表显示了这一点。我想要的是 16 和 17 之类的条目(以红色显示),它是同一天安装和卸载应用程序的同一用户。我不想要其他条目。

我尝试用“AND”代替“OR”,但没有成功。

另外,用户离开的时间大约是 1 分钟,是否有可能得到两者之间的差异?

对我的任何指导将不胜感激。

感谢和问候, 山塔努耆那教

【问题讨论】:

    标签: sql google-cloud-platform google-cloud-firestore google-bigquery


    【解决方案1】:

    你可以试试下面的-

    SELECT
    extract(date from TIMESTAMP_MICROS(event_timestamp)) as Date,
    datedif(min(extract(time from TIMESTAMP_MICROS(event_timestamp))),max(extract(time from TIMESTAMP_MICROS(event_timestamp))),second) as timediff
    user_pseudo_id
    FROM
      `mybits-54f8c.analytics_179636122.events_20200917`
    WHERE event_name in ("app_remove","first_open")
    group by extract(date from TIMESTAMP_MICROS(event_timestamp)),user_pseudo_id
    having count(distinct event_name)=2
    ORDER BY user_pseudo_id, Date
    

    【讨论】:

    • 感谢您的回复。我收到一个错误:SELECT list expression references column event_timestamp 在 [2:36] 既不分组也不聚合,你能帮我解决这个问题吗?
    • @ShantanuJain,我已经更新了答案 - 你可以试一试
    • 感谢@Fahmi 的快速回复。我运行了代码,我得到了这个错误:“未找到函数:datediff;你的意思是 date_diff 吗?在 [3:1] 了解有关 BigQuery SQL 函数的更多信息。”,所以我将函数更改为“date_diff”,但不幸的是,它给了我另一个错误:“DATE_DIFF 不支持在 [3:1] 了解更多关于 BigQuery SQL 函数的第二个日期部分。”很抱歉再次打扰,请您帮忙。谢谢。
    • @ShantanuJain,我已经更新了它 - 它应该是 datedif 而不是 datediff - 你可以检查你的参考 - cloud.google.com/dataprep/docs/html/DATEDIF-Function_57344707
    【解决方案2】:

    如果你想要用户/日期对,你可以使用:

    SELECT extract(date from TIMESTAMP_MICROS(event_timestamp)) as Date,
           user_pseudo_id
    FROM `mybits-54f8c.analytics_179636122.events_20200917`
    WHERE event_name in ('app_remove', 'first_open')
    GROUP BY date, user_pseudo_id
    HAVING COUNT(DISTINCT event_name) = 2;
    

    注意:我不知道 BigQuery 是否支持 dateextract() - 至少 documentation 没有提供该选项。我通常只使用date() 函数。

    如果您想要单独的行 - 而您的问题表明这就是您想要的 - 有几个选项,但从概念上讲,最简单的可能是 EXISTS

    SELECT e.*
    FROM `mybits-54f8c.analytics_179636122.events_20200917` e
    WHERE  event_name in ('app_remove', 'first_open') AND
          EXISTS (SELECT 1
                  FROM `mybits-54f8c.analytics_179636122.events_20200917` e2
                  WHERE e2.user_pseudo_id = e.user_pseudo_id AND
                        date(TIMESTAMP_MICROS(e2.event_timestamp)) = date(TIMESTAMP_MICROS(e.event_timestamp)) AND
                        e2.event_name <> e.event_name
                 );
          
    

    【讨论】:

      猜你喜欢
      • 2018-08-19
      • 1970-01-01
      • 2021-02-07
      • 2012-01-02
      • 2016-01-03
      • 1970-01-01
      • 2019-07-03
      • 2012-12-01
      • 2012-12-26
      相关资源
      最近更新 更多