【问题标题】:How to find periods without activity in BigQuery如何在 BigQuery 中查找没有活动的时段
【发布时间】:2013-02-05 14:48:10
【问题描述】:

我在 BigQuery 中有一个包含某种类型活动的表格,现在只有大约 40Mb 的数据。活动日期存储在其中一个字段中(格式为 YYYY-MM-DD HH:MM:SS 的字符串)。我需要找到方法来确定运行合理时间的不活动时间段(具有一些预定义的阈值)。

我构建的查询已经运行了一个小时。这里是:

SELECT t1.date, MIN(PARSE_UTC_USEC(t1.date) - PARSE_UTC_USEC(t2.date)) AS mintime 
FROM logs t1
JOIN (SELECT date, http_error FROM logs) t2 ON t1.http_error = t2.http_error
WHERE PARSE_UTC_USEC(t1.date) > PARSE_UTC_USEC(t2.date)
GROUP BY t1.date
HAVING mintime > 1000;

想法是: 1. 将表与自身进行 decart 乘法(http_error 是几乎从不改变值的字段,所以它可以解决问题) 2. 只取 date1 > date2 的对 3. 以最小的差异取每个 date1 date2 4. 在最小差异超过阈值的情况下限制选择。

我承认我使用的真正查询是修复无效数据的负担(这增加了额外的操作)。但我真的需要更好的主意来做到这一点。我很高兴听到其他想法

【问题讨论】:

    标签: sql join group-by google-bigquery having-clause


    【解决方案1】:

    我不知道您正在寻找的不活动粒度,但为什么不尝试按您的时间戳分桶,然后计算每个桶中活动的相对频率:

    SELECT
      UTC_USEC_TO_HOUR(PARSE_UTC_USEC(timestamp_usec)) AS hour_bucket,
      COUNT(*) as activity_count
    GROUP BY
      hour_bucket
    ORDER BY
      activity_count ASC;
    

    【讨论】:

    • 是的,这与我最后所做的差不多。谢谢
    猜你喜欢
    • 2020-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-05
    相关资源
    最近更新 更多