【问题标题】:group by day and time in sql BigQuery在 sql BigQuery 中按日期和时间分组
【发布时间】:2021-01-03 13:24:56
【问题描述】:

数据需要在 1 分钟间隔内按时间分组。数据:

id            time                  
111      2020-09-01-09:19:00         
111      2020-09-01-09:19:04        
111      2020-09-01-09:19:08     
112      2020-09-01-10:12:05       
111      2020-09-02-12:36:54     
111      2020-09-02-12:36:58     
111      2020-09-02-12:37:03     
111      2020-09-02-12:37:09     

想要的输出是:

id            time                         
111      2020-09-01-09:19:08     
112      2020-09-01-10:12:05           
111      2020-09-02-12:37:09 

我试过了:

SELECT id, TIMESTAMP(time) 
FROM my_table
GROUP BY id, (DATEPART(MINUTE, [time]) / 1)

Function not found: DATEPART

【问题讨论】:

  • 你真的有这种格式的时间列2020-09-01-09:19:00吗?请确认/澄清
  • 其实这是一个字符串...所以你是对的。我刚刚编辑了我的问题。

标签: sql time group-by google-bigquery timestamp


【解决方案1】:

数据需要在1分钟间隔内按时间分组。

对于这个问题,你可以使用timestamp_trunc()(或datetime_trunc()):

select max(timestamp_trunc(time, minute)), id
from t
group by timestamp_trunc(time, minute), id;

但是,这不会返回您指定的结果。

【讨论】:

    【解决方案2】:

    以下是 BigQuery 标准 SQL

    #standardSQL
    SELECT AS VALUE 
      ARRAY_AGG(t ORDER BY time DESC LIMIT 1)[OFFSET(0)]
    FROM `project.dataset.my_table` t
    GROUP BY id, 
      TIMESTAMP_SUB(
        PARSE_TIMESTAMP('%Y-%m-%d-%H:%M:%S', time), 
        INTERVAL MOD(UNIX_SECONDS(PARSE_TIMESTAMP('%Y-%m-%d-%H:%M:%S', time)), 2 * 60) 
        SECOND
      )     
    

    您可以使用我们的问题中的示例数据进行测试,如以下示例所示

    #standardSQL
    WITH `project.dataset.my_table` AS (
      SELECT 111 id, '2020-09-01-09:19:00' time UNION ALL
      SELECT 111, '2020-09-01-09:19:04' UNION ALL
      SELECT 111, '2020-09-01-09:19:08' UNION ALL
      SELECT 112, '2020-09-01-10:12:05' UNION ALL
      SELECT 111, '2020-09-01-12:36:54' UNION ALL
      SELECT 111, '2020-09-01-12:36:58' UNION ALL
      SELECT 111, '2020-09-01-12:37:03' UNION ALL
      SELECT 111, '2020-09-01-12:37:09' 
    )
    SELECT AS VALUE 
      ARRAY_AGG(t ORDER BY time DESC LIMIT 1)[OFFSET(0)]
    FROM `project.dataset.my_table` t
    GROUP BY id, 
      TIMESTAMP_SUB(
        PARSE_TIMESTAMP('%Y-%m-%d-%H:%M:%S', time), 
        INTERVAL MOD(UNIX_SECONDS(PARSE_TIMESTAMP('%Y-%m-%d-%H:%M:%S', time)), 2 * 60) 
        SECOND
      )     
    

    有输出

    Row     id      time     
    1       111     2020-09-01-09:19:08  
    2       112     2020-09-01-10:12:05  
    3       111     2020-09-01-12:37:09    
    

    注意:要匹配您的预期输出 - 您应该使用 2 分钟间隔而不是 1 分钟间隔

    【讨论】:

      猜你喜欢
      • 2021-01-03
      • 2021-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-10
      • 2020-10-26
      • 2018-04-13
      相关资源
      最近更新 更多