代码之家  ›  专栏  ›  技术社区  ›  Iren Ramadhan

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

  •  0
  • Iren Ramadhan  · 技术社区  · 5 年前

    我有一个问题是如何在一个生成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' ║
    ╚═══════════╩══════════════╩══════════════╩══════════════╝
    

    1 回复  |  直到 5 年前
        1
  •  1
  •   Mikhail Berlyant    5 年前

    下面是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