在 Bigquery 中按用户计算登录之间的时间

Posted

技术标签:

【中文标题】在 Bigquery 中按用户计算登录之间的时间【英文标题】:Calculate Time Between Logins by User in Bigquery 【发布时间】:2021-02-24 00:18:14 【问题描述】:

我正在尝试按用户计算 BigQuery 中 2 个登录事件之间的时间差。我想了解每个用户登录之间需要多长时间。

我尝试过以下查询:

Select user_id, timestamp,
    timestamp_diff(timestamp, (lag(timestamp)over (partition by user_id order by timestamp), minute)) as 
    time_diff
from table 
order by user_id, timestamp

样本数据

user_id event timestamp
aaa Login 2021-02-20 00:00:00 UTC
bbb Login 2021-02-20 00:02:00 UTC
aaa Login 2021-02-20 00:01:00 UTC
ccc Login 2021-02-20 00:02:00 UTC
aaa Login 2021-02-20 00:01:00 UTC
aaa Login 2021-02-20 00:50:00 UTC
bbb Login 2021-02-20 00:13:00 UTC
ccc Login 2021-02-20 00:46:00 UTC

我的结果应该是一列,其中包含当前登录事件和上一个登录事件之间的时间,第一个事件是NULL

【问题讨论】:

请包括期望输出和您当前的输出。 你的代码有什么问题? 【参考方案1】:

您的查询中有额外的括号。所以,写对了:

Select user_id, timestamp,
       timestamp_diff(timestamp, 
                      lag(timestamp) over (partition by user_id order by timestamp),
                      minute
                     ) as time_diff
from table 
order by user_id, timestamp;

您可能还想添加过滤器where event = 'Login'

【讨论】:

【参考方案2】:

括号似乎实际上是导致问题的原因

当查询不那么混乱时,更容易发现这种类型的“错误”

考虑下面的例子

Select user_id, timestamp,
    timestamp_diff(timestamp, lag(timestamp) over win, minute) as time_diff
from `project.dataset.table`
window win as (partition by user_id order by timestamp)
order by user_id, timestamp          

如果应用于您问题中的样本数据 - 输出是

【讨论】:

以上是关于在 Bigquery 中按用户计算登录之间的时间的主要内容,如果未能解决你的问题,请参考以下文章

在 BigQuery 中按字母顺序连接列

如何在bigquery中按月/年汇总

如何计算 SQL Server 中按日期和用户分组的条目之间的平均时间?

Big Query-如何在 Big Query 中按浏览量、用户每周比较数据

在 SQL 中按组中的行计算时间差异

如何在 Looker 中按日期计算状态变化?