Big Query Compute 两个自定义事件之间的平均时间
Posted
技术标签:
【中文标题】Big Query Compute 两个自定义事件之间的平均时间【英文标题】:Big Query Compute Average time between two Custom Events 【发布时间】:2017-06-13 23:49:02 【问题描述】:我正在尝试使用 BigQuery 在我的 Firebase 分析中确定两个事件之间的平均时间。该表如下所示:
我想收集 LOGIN_CALL 和 LOGIN_CALL_OK 事件的 timstamp_micros,从 LOGIN_CALL_OK 中减去 LOGIN_CALL 并计算所有行的平均值。
#standardSQL
SELECT AVG(
(SELECT
event.timestamp_micros
FROM
`table`,
UNNEST(event_dim) AS event
where event.name = "LOGIN_CALL_OK") -
(SELECT
event.timestamp_micros
FROM
`table`,
UNNEST(event_dim) AS event
where event.name = "LOGIN_CALL"))
from `table`
我已经设法列出了低数字或高数字,但每当我尝试对它们进行任何数学运算时,我都会遇到错误,我正在努力解决这个问题。上面的这种方法似乎应该可行,但我收到以下错误:
错误:标量子查询产生了多个元素
我读到这个错误意味着每个 UNNEST() 函数都返回一个数组,而不是导致 AVG 出错的单个值。我尝试取消嵌套一次并将“低”和“嗨”名称应用于值,但无法弄清楚如何正确使用 event_dim.name 进行过滤。
【问题讨论】:
您需要有某种 ID 来连接 LOGIN_CALL 和 LOGIN_CALL_OK 以在它们之间做有意义的区别。 不确定我是否关注?这些被打包到 BigQuery 数据库中的单行中......事件的名称将是我相信的 ID? 啊抱歉,我想我现在更进一步 - 表中有一个 ID,我只是没有在上面包含它。 【参考方案1】:我无法完全测试这个,但也许这对你有用:
WITH data AS(
SELECT STRUCT('1' as user_id) user_dim, ARRAY< STRUCT<date string, name string, timestamp_micros INT64> > [('20170610', 'EVENT1', 1497088800000000), ('20170610', 'LOGIN_CALL', 1498088800000000), ('20170610', 'LOGIN_CALL_OK', 1498888800000000), ('20170610', 'EVENT2', 159788800000000), ('20170610', 'LOGIN_CALL', 1599088800000000), ('20170610', 'LOGIN_CALL_OK', 1608888800000000)] event_dim union all
SELECT STRUCT('2' as user_id) user_dim, ARRAY< STRUCT<date string, name string, timestamp_micros INT64> > [('20170610', 'EVENT1', 1497688500400000), ('20170610', 'LOGIN_CALL', 1497788800000000)] event_dim UNION ALL
SELECT STRUCT('3' as user_id) user_dim, ARRAY< STRUCT<date string, name string, timestamp_micros INT64> > [('20170610', 'EVENT1', 1487688500400000), ('20170610', 'LOGIN_CALL', 1487788845000000), ('20170610', 'LOGIN_CALL_OK', 1498888807700000)] event_dim
)
SELECT
AVG(time_diff) avg_time_diff
FROM(
SELECT
CASE WHEN e.name = 'LOGIN_CALL' AND LEAD(NAME,1) OVER(PARTITION BY user_dim.user_id ORDER BY timestamp_micros ASC) = 'LOGIN_CALL_OK' THEN TIMESTAMP_DIFF(TIMESTAMP_MICROS(LEAD(TIMESTAMP_MICROS, 1) OVER(PARTITION BY user_dim.user_id ORDER BY timestamp_micros ASC)), TIMESTAMP_MICROS(TIMESTAMP_MICROS), day) END time_diff
FROM data,
UNNEST(event_dim) e
WHERE e.name in ('LOGIN_CALL', 'LOGIN_CALL_OK')
)
我已经模拟了 3 个用户,其架构与您在 Firebase Schema 中的架构相同。
基本上,我首先应用了UNNEST
操作,以便获得event_dim.name
的每个值。然后应用过滤器只获取您感兴趣的事件,即“LOGIN_CALL”和“LOGIN_CALL_OK”。
正如 Mosha 上面评论的那样,您确实需要对这些行进行一些标识,否则您将不知道哪个事件成功了,这就是分析函数的分区也将 user_dim.user_id
作为输入的原因。
之后,只需 TIMESTAMP 操作在适当的时候获取差异(当主要事件是“LOGIN_CALL_OK”并且当前事件是“LOGIN_CALL”时,然后取差异。这在 CASE 表达式中表示)。
您可以在TIMESTAMP_DIFF函数中选择您要分析日期的哪一部分,例如秒、分钟、天等。
【讨论】:
谢谢,现在试试。 查询运行,但我只得到“avg dif 0.0” 是的,如果我删除了 AVG,它看起来好像所有 time_diffs 都为 0 或空值。不能保证这些事件彼此相邻,它们可能被其他事件分开(会话开始是最常见的)。不过,这看起来确实是朝着正确方向迈出的一步,非常感谢。 另外,从原始照片中可能并不清楚,但这些事件都在一行中,每个用户会话一行。这可能并不理想 - 这些分析有点混乱,可能需要重写。 @NathanielD.Waggoner 嗯,这很奇怪。您能否确认这些事件是否保存在同一个timestamp_micros
中?另外,如果您在timestamp_diff
函数中将日期精度更改为“秒”或“分钟”会怎样?以上是关于Big Query Compute 两个自定义事件之间的平均时间的主要内容,如果未能解决你的问题,请参考以下文章
7 天用户计数:Big-Query 自加入以获取日期范围和计数?
Google Data Studio:如何使用自定义 Big Query 查询创建时间序列图表
Google Big Query 按页面路径和 Google Analytics 数据的自定义维度获取用户计数
Firebase Analytics 中的事件未显示在 Big Query 中