【问题标题】:Detect 30 days (or more) interval between events using event timestamp in BigQuery使用 BigQuery 中的事件时间戳检测事件之间的 30 天(或更长时间)间隔
【发布时间】:2018-02-23 02:39:54
【问题描述】:

我有一张这样的桌子:

uid |事件名称 |时间戳 ------ | ------ | -------- 用户 ID1 |登录 | 1501839197 用户 ID1 |登录 | 1501840142 用户 ID2 |登录 | 1503261360 用户 ID2 |登录 | 1503261858 用户 ID3 |登录 | 1502681803 用户 ID3 |登录 | 1502376007

任务是选择登录事件间隔超过 30 天的那些 uid。换句话说,我需要始终将每个事件的时间戳与前一个事件的时间戳进行比较,如果间隔 >= 30 天,则将 uid 添加到结果表中。

结果表应该只包含 uid。

谢谢!

【问题讨论】:

    标签: sql events timestamp google-bigquery


    【解决方案1】:

    对于初学者,我在这里使用了标准 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 的原因)。

    如果您的 timestamp 列的类型为 INT64,那么您可以使用 TIMESTAMP_SECONDS()TIMESTAMP_MILLIS() 函数将数字转换为 BigQuery 中的时间戳 (documentation)。

    【讨论】:

    • 谢谢,马辛!看起来它应该工作。但我忘记了一件事。时间戳列是 INTEGER,而不是 TIMESTAMP。我在尝试执行代码时得到了这个[参数类型的函数 TIMESTAMP_DIFF 没有匹配的签名:INT64、INT64、DATE_TIME_PART。支持的签名:TIMESTAMP_DIFF(TIMESTAMP, TIMESTAMP, DATE_TIME_PART)] 我们应该将整数转换为时间戳吗?如果是,怎么做?
    • 标记了这个答案,因为当时间戳列是时间戳类型时它可以完美运行。
    猜你喜欢
    • 2015-02-24
    • 1970-01-01
    • 1970-01-01
    • 2021-11-06
    • 1970-01-01
    • 1970-01-01
    • 2020-10-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多