计算 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 来表示MINMAX 并不正确,但不会改变结果,因为在这种情况下,分区内的排序无关紧要。这与SUM() 不同,因为我们对运行总数感兴趣,并且指定分区顺序很重要。我的理解正确吗? 分区语法中的ORDER BY 子句执行“累积”功能。这适用于MIN()MAX()SUM()。它影响到所有人。但是,如果第一个值是MIN(),那么无论有没有ORDER BY,它都会返回相同的结果。

以上是关于计算 BigQuery 中时间戳之间的平均延迟的主要内容,如果未能解决你的问题,请参考以下文章

计算一列中时间戳之间的持续时间

如何获得蜂巢中时间戳的平均差异

Mysql查询将返回数据库中时间戳之间的空闲槽

如何使用 SQL 显示两个不同区域中时间戳之间的实时差异?

python中时间戳,datetime 和时间字符串之间得转换

如何计算 Mongoose/NodeJS 中时间戳字段中的不同日期项?