如何在 BigQuery 的开始日期和结束日期之间复制生成日期的行?

Posted

技术标签:

【中文标题】如何在 BigQuery 的开始日期和结束日期之间复制生成日期的行?【英文标题】:How to duplicate rows generating dates between Start Date and End Date in BigQuery? 【发布时间】:2019-10-16 04:19:00 【问题描述】:

我有一个关于如何复制表中的行的问题,该表在 StartDate 和 EndDate 之间生成日期。实际上,我和Duplicating records to fill gap between dates in Google BigQuery 有同样的问题,但表格类型不同。

所以,我的桌子是这样的:

╔═══════════╦══════════════╦══════════════╗
║ user_name ║  start_date  ║   end_date   ║
╠═══════════╬══════════════╬══════════════╣
║     A     ║ '2019-07-01' ║ '2019-07-31' ║
╚═══════════╩══════════════╩══════════════╝

我希望输出是这样的:

╔═══════════╦══════════════╦══════════════╦══════════════╗
║ user_name ║  start_date  ║   end_date   ║     date     ║
╠═══════════╬══════════════╬══════════════╬══════════════╣
║     A     ║ '2019-07-01' ║ '2019-07-31' ║ '2019-07-01' ║
╠═══════════╬══════════════╬══════════════╬══════════════╣
║     A     ║ '2019-07-01' ║ '2019-07-31' ║ '2019-07-02' ║
╠═══════════╬══════════════╬══════════════╬══════════════╣
║     A     ║ '2019-07-01' ║ '2019-07-31' ║ '2019-07-03' ║
╠═══════════╬══════════════╬══════════════╬══════════════╣
║     A     ║ '2019-07-01' ║ '2019-07-31' ║ '2019-07-04' ║
╠═══════════╬══════════════╬══════════════╬══════════════╣
║    ...    ║      ...     ║      ...     ║      ...     ║
╠═══════════╬══════════════╬══════════════╬══════════════╣
║     A     ║ '2019-07-01' ║ '2019-07-31' ║ '2019-07-31' ║
╚═══════════╩══════════════╩══════════════╩══════════════╝

我应该如何将它放在查询中?提前致谢。

【问题讨论】:

见How to generate date series to occupy absent dates in google BiqQuery?。 SQL不太擅长生成数据,你要找的是日历表。然后,只需将该日历表加入您的表即可。 【参考方案1】:

以下是 BigQuery 标准 SQL

#standardSQL
WITH `project.dataset.table` AS (
  SELECT 'A' user_name, DATE '2019-07-01' start_date, DATE '2019-07-31' end_date
)
SELECT user_name, start_date, end_date, day
FROM `project.dataset.table`, 
UNNEST(GENERATE_DATE_ARRAY(start_date, end_date)) day
ORDER BY user_name, day  

结果

Row user_name   start_date  end_date    day  
1   A           2019-07-01  2019-07-31  2019-07-01   
2   A           2019-07-01  2019-07-31  2019-07-02   
3   A           2019-07-01  2019-07-31  2019-07-03   
. . . 
29  A           2019-07-01  2019-07-31  2019-07-29   
30  A           2019-07-01  2019-07-31  2019-07-30   
31  A           2019-07-01  2019-07-31  2019-07-31   

【讨论】:

以上是关于如何在 BigQuery 的开始日期和结束日期之间复制生成日期的行?的主要内容,如果未能解决你的问题,请参考以下文章

Python Google BigQuery 参数化 SELECT

使用 Google BigQuery 上的开始/结束日期优化活动帐户查询

如何设置开始日期和结束日期之间的验证应在 3 年内选择

MySQL - 如何查找日期在开始日期到结束日期之间的记录

如何使用Java Streams API正确过滤开始日期和结束日期之间的日期?

如何选择实体的计数,其中时间序列日期介于该实体的开始日期和结束日期之间