【问题标题】:Populating a table with all dates in a given range in Google BigQuery在 Google BigQuery 中使用给定范围内的所有日期填充表格
【发布时间】:2016-11-13 08:18:09
【问题描述】:

是否有任何便捷的方法可以在 Google BigQuery 中使用给定范围内的所有日期填充表格?我需要的是从 2015-06-01 到 CURRENT_DATE() 的所有日期,所以是这样的:

+------------+
| date       |
+------------+
| 2015-06-01 |
| 2015-06-02 |
| 2015-06-03 |
| ...        |
| 2016-07-11 |
+------------+

理想情况下,下一步也是获取两个日期之间的所有周数,即:

+---------+
| week    |
+---------+
| 2015-23 |
| 2015-24 |
| 2015-25 |
| ...     |
| 2016-28 |
+---------+

我一直在摆弄我找到的以下答案,但我无法让它们工作,主要是因为不支持核心功能并且我找不到合适的方法来替换它们。

Easiest way to populate a temp table with dates between and including 2 date parameters

Generate Dates between date ranges

非常感谢您的帮助!

最好, 最大

【问题讨论】:

    标签: google-bigquery


    【解决方案1】:

    Mikhail 的答案完美适用于 BigQuery 的旧版 sql 语法。如果您使用标准 SQL 语法,此解决方案会稍微简单一些。

    BigQuery 标准 SQL 语法实际上有一个内置函数 GENERATE_DATE_ARRAY,用于根据日期范围创建数组。它需要一个开始日期、结束日期和INTERVAL。例如:

    SELECT day
    FROM UNNEST(
        GENERATE_DATE_ARRAY(DATE('2015-06-01'), CURRENT_DATE(), INTERVAL 1 DAY)
    ) AS day
    

    如果你想要星期和年份,你可以使用

    SELECT EXTRACT(YEAR FROM day), EXTRACT(WEEK FROM day)
    FROM UNNEST(
        GENERATE_DATE_ARRAY(DATE('2015-06-01'), CURRENT_DATE(), INTERVAL 1 WEEK)
    ) AS day
    

    【讨论】:

      【解决方案2】:

      所有日期从 2015-06-01 到 CURRENT_DATE()

      SELECT DATE(DATE_ADD(TIMESTAMP("2015-06-01"), pos - 1, "DAY")) AS DAY
      FROM (
           SELECT ROW_NUMBER() OVER() AS pos, *
           FROM (FLATTEN((
           SELECT SPLIT(RPAD('', 1 + DATEDIFF(TIMESTAMP(CURRENT_DATE()), TIMESTAMP("2015-06-01")), '.'),'') AS h
           FROM (SELECT NULL)),h
      )))
      

      两个日期之间的所有星期

      SELECT YEAR(DAY) AS y, WEEK(DAY) AS w
      FROM (
        SELECT DATE(DATE_ADD(TIMESTAMP("2015-06-01"), pos - 1, "DAY")) AS DAY
        FROM (
             SELECT ROW_NUMBER() OVER() AS pos, *
             FROM (FLATTEN((
             SELECT SPLIT(RPAD('', 1 + DATEDIFF(TIMESTAMP(CURRENT_DATE()), TIMESTAMP("2015-06-01")), '.'),'') AS h
             FROM (SELECT NULL)),h
        )))
      )
      GROUP BY y, w
      

      【讨论】:

      • 太棒了!非常感谢:)
      猜你喜欢
      • 2018-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-05
      • 2011-08-17
      • 2014-07-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多