sql - 当 SQL 中只有时间戳可用时导出 session 持续时间

标签 sql google-bigquery

我想计算应用程序的使用 session 持续时间。但是,在提供的日志中,我可以获得的唯一相关信息是时间戳。以下是单个用户的简化日志。

record_num, user_id, record_ts
-----------------------------
1, uid_1, 12:01am
2, uid_1, 12:02am
3, uid_1, 12:03am
4, uid_1, 12:22am
5, uid_1, 12:22am
6, uid_1, 12:25am

假设 session 在 15 分钟不活动后结束,则上述日志将包含 2 个 session 。现在我想计算两个 session 的平均持续时间。

我可以通过首先计算每条记录之间的时间差来得出 session 数,只要差异超过 15 分钟,就算一个 session 。

但是要导出持续时间,因为我需要知道每个 session 的 min(record_ts) 和 max(record_ts) 。但是,如果没有某种 session_id,我无法将记录分组到关联的 session 中。

是否有任何基于 SQL 的方法可以解决这个问题?

最佳答案

假设您也有日期(没有日期就意味着计算 session 的结束时间是否在开始时间之前开始),类似这样的事情会起作用:

WITH CTE AS
(SELECT * FROM
(SELECT 1 record_num, "uid_1" user_id, TIMESTAMP('2018-10-01 12:01:00') record_ts)
UNION ALL
(SELECT 2 record_num, "uid_1" user_id, TIMESTAMP('2018-10-01 12:02:00') record_ts)
UNION ALL
(SELECT 3 record_num, "uid_1" user_id, TIMESTAMP('2018-10-01 12:03:00') record_ts)
UNION ALL
(SELECT 4 record_num, "uid_1" user_id, TIMESTAMP('2018-10-01 12:22:00') record_ts)
UNION ALL
(SELECT 5 record_num, "uid_1" user_id, TIMESTAMP('2018-10-01 12:22:00') record_ts)
UNION ALL
(SELECT 6 record_num, "uid_1" user_id, TIMESTAMP('2018-10-01 12:25:00') record_ts)
UNION ALL
(SELECT 7 record_num, "uid_1" user_id, TIMESTAMP('2018-10-01 12:59:00') record_ts)),

sessions as
(SELECT
  if(timestamp_diff(record_ts,lag(record_ts,1) OVER (PARTITION BY user_id ORDER BY     
    record_ts, record_num),MINUTE) >= 15 OR
    lag(record_ts,1) OVER (PARTITION BY user_id ORDER BY record_ts, record_num) IS NULL,1,0)
  session, record_num, user_id, record_ts
FROM CTE)

SELECT sum(session) OVER (PARTITION BY user_id ORDER BY record_ts, record_num) 
  sessionNo, record_num, user_id, record_ts
FROM sessions 

关键是您希望 session 之间的分钟数。在上面的例子中,我将其设置为 15 分钟 (>= 15)。显然,将 session 编号与 user_Id 和 session 开始时间连接起来以创建唯一的 session 标识符可能很有用。

enter image description here

关于sql - 当 SQL 中只有时间戳可用时导出 session 持续时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52868294/

相关文章:

selection - 大查询 - 和/或运算符

google-bigquery - 在 Big Query 中将多列嵌套到一个数组中

sql - 在 Django 原始 sql 中使用 like 语句时出错

mysql - 是否需要全表扫描来计算某些属性大于 x 的行?

sql - 连接两个表时索引如何提高性能

sql - 如何合并 BigQuery 中多行的 NULL?

google-bigquery - 不与 GROUP BY 和 HAVING 一起使用

php - 使用 Laravel 的播种与 ST_GEOMFROMTEXT 播种坐标会导致错误

sql - 解决两个表之间的排序规则问题

google-bigquery - 如何在 Java 中创建分区 BigQuery 表