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 添加完整的日期范围的主要内容,如果未能解决你的问题,请参考以下文章
如何在 BigQuery SQL 中为与按日期排序的主 ID 关联的子 ID 编号?
将 Airflow 运行 id、dag id、执行日期等变量导出到 Bigquery 表