Bigquery 生成周范围从一年中的每一天开始

问题描述 投票:0回答:1

我想生成一个 DimDate 表,包括从 2023-01-01 到 2024-12-31(也许未来更多年)。 range_start 应始终从一年的第一天开始,例如 2023-01-01。间隔为一周。不要考虑周名。一年的最后一周应包括一年中的剩余时间,如示例中所示。

样品:

完整日期 范围_开始 范围结束
2023-01-01 2023-01-01 2023-01-07
2023-01-02 2023-01-01 2023-01-07
2023-01-03 2023-01-01 2023-01-07
2023-01-04 2023-01-01 2023-01-07
2023-01-05 2023-01-01 2023-01-07
2023-01-06 2023-01-01 2023-01-07
2023-01-07 2023-01-01 2023-01-07
2023-01-08 2023-01-08 2023-01-14
2023-01-09 2023-01-08 2023-01-14
2023-01-10 2023-01-08 2023-01-14
2023-01-11 2023-01-08 2023-01-14
2023-01-12 2023-01-08 2023-01-14
2023-01-13 2023-01-08 2023-01-14
2023-01-14 2023-01-08 2023-01-14
巴拉巴拉..
2023-12-17 2023-12-17 2023-12-23
2023-12-18 2023-12-17 2023-12-23
2023-12-19 2023-12-17 2023-12-23
2023-12-20 2023-12-17 2023-12-23
2023-12-21 2023-12-17 2023-12-23
2023-12-22 2023-12-17 2023-12-23
2023-12-23 2023-12-17 2023-12-23
2023-12-24 2023-12-24 2023-12-31
2023-12-25 2023-12-24 2023-12-31
2023-12-26 2023-12-24 2023-12-31
2023-12-27 2023-12-24 2023-12-31
2023-12-28 2023-12-24 2023-12-31
2023-12-29 2023-12-24 2023-12-31
2023-12-30 2023-12-24 2023-12-31
2023-12-31 2023-12-24 2023-12-31
2024-01-01 2024-01-01 2024-01-07
2024-01-02 2024-01-01 2024-01-07
2024-01-03 2024-01-01 2024-01-07
2024-01-04 2024-01-01 2024-01-07
2024-01-05 2024-01-01 2024-01-07
2024-01-06 2024-01-01 2024-01-07
2024-01-07 2024-01-01 2024-01-07
2024-01-08 2024-01-08 2024-01-14
2024-01-09 2024-01-08 2024-01-14
2024-01-10 2024-01-08 2024-01-14
2024-01-11 2024-01-08 2024-01-14
2024-01-12 2024-01-08 2024-01-14
2024-01-13 2024-01-08 2024-01-14
2024-01-14 2024-01-08 2024-01-14
巴拉巴拉..

问了ChatGPT很多次最终的版本是这样的:

WITH
  dates AS (
  SELECT
    date AS fulldate
  FROM
    UNNEST(GENERATE_DATE_ARRAY('2023-01-01', '2024-12-31')) AS date )
SELECT
  fulldate,
  cast(DATE_ADD(fulldate, INTERVAL -(MOD(EXTRACT(DAYOFWEEK
        FROM
          fulldate) - 1, 7)) DAY) as date) AS range_start,
  cast(DATE_ADD(fulldate, INTERVAL (7 - MOD(EXTRACT(DAYOFWEEK
        FROM
          fulldate) - 1, 7)) DAY) - INTERVAL 1 DAY as date) AS range_end
FROM
  dates;

这从一开始就很好,但在 2023 年最后一周就很糟糕。而且 2024 年不会从 1 月 1 日重新开始。有没有一个完美的脚本来解决这个问题呢?不然只能用excel手动输入记录,很痛苦...

sql date google-cloud-platform google-bigquery
1个回答
0
投票

我的转储解决方案,如果没有人可以帮助或者可能没有完美的方法......

create or replace table `dim_date` as
WITH
  dates AS (
  SELECT
    date AS fulldate
  FROM
    UNNEST(GENERATE_DATE_ARRAY('2023-01-01', '2023-12-31')) AS date )
SELECT
  fulldate,
  cast(DATE_ADD(fulldate, INTERVAL -(MOD(EXTRACT(DAYOFWEEK
        FROM
          fulldate) - 1, 7)) DAY) as date) AS range_start,
  cast(DATE_ADD(fulldate, INTERVAL (7 - MOD(EXTRACT(DAYOFWEEK
        FROM
          fulldate) - 1, 7)) DAY) - INTERVAL 1 DAY as date) AS range_end
FROM
  dates;

update  `dim_date` set range_end = '2023-12-31' where range_start ='2023-12-24';
update  `dim_date` set range_start = '2023-12-24' where fulldate ='2023-12-31';
update  `dim_date` set range_end = '2023-12-31' where fulldate ='2023-12-31';
© www.soinside.com 2019 - 2024. All rights reserved.