BigQuery按用户维度计算相邻登录事件时间差的实现方法
原查询问题修正
- 语法错误:
TIMESTAMP_DIFF()函数的括号嵌套逻辑错误,错误将窗口函数返回结果与时间单位共同包裹在第二层括号内,不符合函数传参规则 - 场景遗漏:未限定仅统计
event = 'Login'的事件,会将非登录行为纳入间隔计算 - 冗余处理:示例中存在同一用户同一时间戳的重复登录记录,未做去重会产生无意义的0值间隔
修正后查询语句
SELECT user_id, timestamp, -- 按用户分区、登录时间升序排序,计算当前登录与上一次登录的分钟差 TIMESTAMP_DIFF( timestamp, LAG(timestamp) OVER (PARTITION BY user_id ORDER BY timestamp), MINUTE ) AS time_diff FROM `your-project.your-dataset.your-table` -- 替换为实际业务表的全路径 WHERE event = 'Login' -- 仅筛选登录事件 -- 去重:同一用户同一时间戳的重复登录仅保留1条,避免无效0间隔 QUALIFY ROW_NUMBER() OVER (PARTITION BY user_id, timestamp) = 1 ORDER BY user_id, timestamp
注:如果业务场景需要保留同用户同一时刻的所有重复登录记录,可删除QUALIFY子句,此时重复时间戳对应的
time_diff会返回0。
基于示例数据的输出结果
| user_id | timestamp | time_diff | 备注 |
|---|---|---|---|
| aaa | 2021-02-20 00:00:00 UTC | NULL | 用户aaa的首次登录记录 |
| aaa | 2021-02-20 00:01:00 UTC | 1 | 与上一次登录间隔1分钟 |
| aaa | 2021-02-20 00:50:00 UTC | 49 | 与上一次登录间隔49分钟 |
| bbb | 2021-02-20 00:02:00 UTC | NULL | 用户bbb的首次登录记录 |
| bbb | 2021-02-20 00:13:00 UTC | 11 | 与上一次登录间隔11分钟 |
| ccc | 2021-02-20 00:02:00 UTC | NULL | 用户ccc的首次登录记录 |
| ccc | 2021-02-20 00:46:00 UTC | 44 | 与上一次登录间隔44分钟 |
内容的提问来源于stack exchange,提问作者nametaco
相关产品推荐
相关产品推荐

