我有一个这样的表:
uid | eventName | timestamp ------ | ------ | ------- userId1 | login | 1501839197 userId1 | login | 1501840142 userId2 | login | 1503261360 userId2 | login | 1503261858 userId3 | login | 1502681803 userId3 | login | 1502376007
任务是选择登录事件之间间隔超过 30 天的 uid。换句话说,我需要一致地将每个事件的时间戳与前一个事件的时间戳进行比较,如果间隔 >= 30 天,则将 uid 添加到结果表中。
结果表应该只包含 uid。
谢谢!
最佳答案
对于初学者来说,我在这里使用了标准 SQL BigQuery 语法。
要找到此类用户,您可以使用LAG功能( documentation )。
with data as
(
select uid, timestamp,
LAG(timestamp, 1) OVER (PARTITION BY uid ORDER BY TIMESTAMP) as last_login
from YOUR_TABLE
where eventName = 'login'
)
select uid from data
where TIMESTAMP_DIFF(timestamp, last_login, HOUR) >= (30 * 24)
此函数允许您按照 PARTITION BY 子句定义的顺序访问上一行。然后,您只需要选择天数差异大于或等于 30 天的行(TIMESTAMP_DIFF
没有 DAY
支持,这就是我使用 30* 的原因24).
如果您的时间戳列的类型为INT64
,那么您可以使用TIMESTAMP_SECONDS()
或TIMESTAMP_MILLIS()
在 BigQuery 中将数字转换为时间戳的函数 ( documentation )。
关于sql - 使用 BigQuery 中的事件时间戳检测事件之间的 30 天(或更长)间隔,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46213566/