【问题标题】:Bigquery - Add full date range to each idBigquery - 为每个 id 添加完整的日期范围
【发布时间】:2021-01-11 13:54:10
【问题描述】:

如何将 GENERATE_DATE_ARRAY(start_date, end_date[, INTERVAL INT64_expr date_part]) 应用于数据集中的每条记录。我了解如何应用它来获取从头到尾的单个日期范围,但不知道如何将相同的日期数组应用于每个 id。

假设我有两个不同的 ID,x 和 y,日期如下:

      |id|date
      --------------
    1 |x |2021-01-01
    2 |x |2021-01-03 
    3 |y |2021-01-06 
    4 |y |2021-01-09

我想为每个 ID 填写日期空白

我怎样才能实现以下输出?

      |id|date
      --------------
    1 |x |2021-01-01 
    2 |x |2021-01-02 
    3 |x |2021-01-03
    4 |y |2021-01-06 
    5 |y |2021-01-07
    6 |y |2021-01-08
    7 |y |2021-01-09

【问题讨论】:

    标签: arrays date google-bigquery


    【解决方案1】:

    以下是 BigQuery 标准 SQL

    select id, date from (
      select id, date, lead(date) over(partition by id order by date) next_date
      from `project.dataset.table`
    ), unnest(generate_date_array(date, next_date)) date 
    where not next_date is null
    -- order by date    
    

    如果应用于您问题的样本数据 - 输出是

    【讨论】:

    • 嘿,基于这个例子,如果我想将'2021-01-09'的最后一条记录复制到当前日期,该怎么做?如 y |2021-01-09 直到 y |2021-06-22
    【解决方案2】:

    在 BigQuery 的标准 SQL 中尝试以下操作:

    with data as (
      select 'x' as id, date '2021-01-01' as date
      UNION ALL
      select 'x' as id, date '2021-01-03' as date
      UNION ALL
      select 'y' as id, date '2021-01-06' as date
      UNION ALL
      select 'y' as id, date '2021-01-09' as date
    )
      select d1.id, date
      from data d1 
        join data d2 
          on d1.id = d2.id 
          and d1.date < d2.date, unnest(GENERATE_DATE_ARRAY(d1.date, d2.date, INTERVAL 1 DAY)) as date;
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多