如何在 BigQuery 中根据时间间隔将时间戳分类为时间组?

问题描述 投票:0回答:1

我需要根据以下逻辑为每个logging_time分配一个time_group:

  1. 对于最早的时间戳,time_group 应与logging_time 相同。
  2. 对于后续行,将logging_time与前一行的time_group进行比较:
    • 如果logging_time和time_group之间的差异在3分钟以内,则使用上一行的time_group。
    • 如果差异超过3分钟,请将time_group设置为当前的logging_time。
记录时间 时间组(预计)
2023-12-10 17:03:05 2023-12-10 17:03:05
2023-12-10 17:05:02 2023-12-10 17:03:05
2023-12-10 17:06:18 2023-12-10 17:06:18
2023-12-10 17:10:07 2023-12-10 17:10:07
2023-12-11 08:31:27 2023-12-11 08:31:27

我一直在尝试在 BigQuery 中实现这一点,但我似乎无法实现所需的输出。

google-cloud-platform google-bigquery
1个回答
0
投票

您可以使用 CTE 或带有 WINDOW 函数的子查询

LAG
来获得所需的结果。

我在 MySQL 中完成了此操作,您可能想要复制。

架构(MySQL v9)

CREATE TABLE LogTime (
    logged_time DATETIME NOT NULL
);

-- Insert values into the LogTime table
INSERT INTO LogTime (logged_time) VALUES
('2023-12-10 17:03:05'),
('2023-12-10 17:05:02'),
('2023-12-10 17:06:18'),
('2023-12-10 17:10:07'),
('2023-12-11 08:31:27');

查询#1

WITH TEMP_TABLE AS (
    SELECT
        logged_time,
       COALESCE(
           if(LAG(logged_time) OVER w < logged_time - INTERVAL 3 MINUTE,
            logged_time, LAG(logged_time) OVER w)
        , logged_time) AS t_group
    FROM
        LogTime
        WINDOW w AS (ORDER BY logged_time)
) -- SELECT * FROM TEMP_tABLE

SELECT
    logged_time,
    if(LAG(t_group) OVER() < logged_time - INTERVAL 3 MINUTE,
        logged_time, t_group) AS time_group
    FROM
        TEMP_TABLE;
记录时间 时间组
2023-12-10 17:03:05 2023-12-10 17:03:05
2023-12-10 17:05:02 2023-12-10 17:03:05
2023-12-10 17:06:18 2023-12-10 17:06:18
2023-12-10 17:10:07 2023-12-10 17:10:07
2023-12-11 08:31:27 2023-12-11 08:31:27

在 DB Fiddle 上查看

© www.soinside.com 2019 - 2024. All rights reserved.