Bigquery - 为每个 id 添加完整的日期范围

Posted

技术标签:

【中文标题】Bigquery - 为每个 id 添加完整的日期范围【英文标题】:Bigquery - Add full date range to each 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

【问题讨论】:

【参考方案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;

【讨论】:

谢谢!它似乎工作正常。我使用了 Mikhail Berlyant 的以下答案,因为它更适合我当前的查询。 乐于助人。如果有帮助,请考虑对答案进行投票:) What should I do when someone answers my question?

以上是关于Bigquery - 为每个 id 添加完整的日期范围的主要内容,如果未能解决你的问题,请参考以下文章

SQL BigQuery - 插入具有不同日期范围的行

如何在 BigQuery SQL 中为与按日期排序的主 ID 关联的子 ID 编号?

将 Airflow 运行 id、dag id、执行日期等变量导出到 Bigquery 表

BigQuery - 在给定的时间点获取不同的值

BigQuery - 如何选择每个用户点击的第一个广告系列?

如何将日期转换为 CDT 并使用 BigQuery 制作连接字符串?