sql - 使用 BigQuery 中的事件时间戳检测事件之间的 30 天(或更长)间隔

标签 sql events timestamp google-bigquery

我有一个这样的表:

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/

相关文章:

javascript - 使用 JavaScript 模拟 Tab 按键

sql - CURRENT_TIMESTAMP 和 CURRENT_DATE 之间的区别

java - 在 Oracle JDBC 驱动程序中,当您将 Java 日期写入 TIMESTAMP 列时,时区会发生什么变化?

mysql - 为什么不在下面的sql中使用两个索引

ios - 将触摸事件传递给适当的兄弟 UIView

java - 为什么 TimerTask 运行了两次?

sql - 如何在 Big Query 中将访问开始时间转换为可读的人工日期或时间戳?

SQL 选择到字段

sql - 将 Object_id() 函数与 #tables 一起使用

php - MYSQL 事件正在运行但不起作用