计算 BigQuery 中时间戳之间的平均延迟
Posted
技术标签:
【中文标题】计算 BigQuery 中时间戳之间的平均延迟【英文标题】:Calculating the average lag between timestamps in BigQuery 【发布时间】:2021-08-28 06:42:26 【问题描述】:我的数据大致有以下结构:
client_id | visit_number | session_start_time | hit_count
我目前正在使用:
SELECT client_id, visit_number, SUM(hit_count) OVER (PARTITION BY client_id ORDER BY visit_number),
session_start_time - LAG(session_start_time) OVER (PARTITION by client_id ORDER BY visit_number)
FROM session_table
理想情况下,我希望获得客户点击次数的滚动总和(这似乎工作正常)。连续会话之间的平均增量也很方便。希望我为当前会话计算一个增量的方法是正确的,但我不确定计算平均增量的合理方法。
一个想法是将上面的查询包装成一个 CTE,然后在另一个窗口函数中计算平均值,但我相信它可以在一个查询中完成。
【问题讨论】:
请提供样本数据和期望的结果。 “连续会话之间的平均增量”是什么意思?您定义的增量只有一个。 【参考方案1】:如果您想要会话之间到本次会话的平均时间,那么您可以通过将当前时间减去第一次并除以会话数减去 1 来计算它:
SELECT client_id, visit_number,
SUM(hit_count) OVER (PARTITION BY client_id ORDER BY visit_number),
session_start_time - LAG(session_start_time) OVER (PARTITION by client_id ORDER BY visit_number) as delta,
(session_start_time -
MIN(session_start_time) OVER (PARTITION by client_id)
) / NULLIF(ROW_NUMBER() OVER (PARTITION BY client_id ORDER BY session_start_time) - 1, 0) as avg_delta
FROM session_table;
【讨论】:
谢谢,这正是我想要实现的目标。我可以问你一个更简单的问题吗?在OVER()
中使用ORDER BY
来表示MIN
和MAX
并不正确,但不会改变结果,因为在这种情况下,分区内的排序无关紧要。这与SUM()
不同,因为我们对运行总数感兴趣,并且指定分区顺序很重要。我的理解正确吗?
分区语法中的ORDER BY
子句执行“累积”功能。这适用于MIN()
、MAX()
和SUM()
。它影响到所有人。但是,如果第一个值是MIN()
,那么无论有没有ORDER BY
,它都会返回相同的结果。以上是关于计算 BigQuery 中时间戳之间的平均延迟的主要内容,如果未能解决你的问题,请参考以下文章