查询触发了“ app_remove”事件的用户,然后检查在该事件之前触发了什么事件

时间:2019-01-22 03:36:42

标签: google-bigquery

我一直在思考如何做到这一点,一直在寻找答案,但无济于事。我实际上想知道我想要实现的目标是否真的可能。

我想做的是...

  1. 我想首先找到所有已触发事件“ app_remove”的用户(从而忽略所有未触发该事件的用户)。

  2. 找到所有这些用户之后,对于每个用户,我想检查在触发“ app_remove”事件之前的X分钟内触发的所有事件。

我基本上想知道用户在卸载应用程序之前要做的最后一件事。

是否可以为所有用户执行此操作,还是只能针对每个用户执行此操作?

我什至不知道从哪里开始进行分组操作,因此我目前选择一次尝试查看一个用户。这是我目前所在的位置,在编写了不完整的IF语句后被卡住了:

SELECT
  TIMESTAMP_MICROS(event_timestamp) as time_stamp, event_name, user_pseudo_id
FROM
  `mana-monsters.analytics_182655472.events_*`
WHERE
  _TABLE_SUFFIX BETWEEN '20180101' AND '20190121' AND
  user_pseudo_id = '026e1dd2cfe2344cdf2acf6dab2a123c' AND
  IF (event_name = 'app_remove')
GROUP BY
  time_stamp, event_name, user_pseudo_id
ORDER BY
  time_stamp DESC

希望我能提供足够的信息。

预先感谢您提供任何帮助或指导,以了解如何从理论上解决问题。

1 个答案:

答案 0 :(得分:0)

我认为使用INNER JOIN作为过滤器可能是一种选择。代码应如下所示:

SELECT
  TIMESTAMP_MICROS(a.event_timestamp) as time_stamp, a.event_name, a.user_pseudo_id
FROM
  `mana-monsters.analytics_182655472.events_*` a INNER JOIN (SELECT user_pseudo_id, event_timestamp from `mana-monsters.analytics_182655472.events_*` where event_name = 'app_remove') b on 
  a.user_pseudo_id = b.user_pseudo_id and b.event_timestamp - a.event_timestamp < 1000 and b.event_timestamp - a.event_timestamp >= 0
ORDER BY
  user_pseudo_id, time_stamp DESC

我一直在处理一些虚拟数据,并且对我有用:

#standardSQL
WITH my_table as(
select 1454911123456789 as event_timestamp, 'app_remove' as event_name, '1' as user_pseudo_id UNION ALL
select 1454911123456788 as event_timestamp, 'app_close' as event_name, '1' as user_pseudo_id UNION ALL
select 1454911123456778 as event_timestamp, 'connection_lost' as event_name, '1' as user_pseudo_id UNION ALL
select 1457911123451231 as event_timestamp, 'app_open' as event_name, '2' as user_pseudo_id UNION ALL
select 1457911123450123 as event_timestamp, 'app_close' as event_name, '2' as user_pseudo_id UNION ALL
select 1457911123450035 as event_timestamp, 'connection_lost' as event_name, '2' as user_pseudo_id UNION ALL
select 1459911123455664 as event_timestamp, 'app_remove' as event_name, '3' as user_pseudo_id UNION ALL
select 1459911123455456 as event_timestamp, 'app_close' as event_name, '3' as user_pseudo_id UNION ALL
select 1459911123455354 as event_timestamp, 'game_lost' as event_name, '3' as user_pseudo_id)
SELECT
  TIMESTAMP_MICROS(a.event_timestamp) as time_stamp, a.event_name, a.user_pseudo_id
FROM
  my_table a INNER JOIN (SELECT user_pseudo_id, event_timestamp from my_table where event_name = 'app_remove') b on 
  a.user_pseudo_id = b.user_pseudo_id and b.event_timestamp - a.event_timestamp < 1000 and b.event_timestamp - a.event_timestamp >= 0
ORDER BY
  user_pseudo_id, time_stamp DESC

虚拟数据太简单了,因此您可能必须进行一些修改才能适合您的用例。这只是显示可能解决方案的示例。