繁体   English   中英

使用 _YYYYMMDD 形式的日期分片创建表

[英]Create table with date shards of the form _YYYYMMDD

假设我创建了这个表,例如:

-- create a temporary table to use in this minimum example
CREATE OR REPLACE TABLE `project_id.dataset_id.example_table` AS
 (SELECT 'Adams' as LastName, 51 as OpponentID, 3 as PointsScored UNION ALL
  SELECT 'Buchanan', 77, 0 UNION ALL
  SELECT 'Coolidge', 77, 1 UNION ALL
  SELECT 'Adams', 52, 4 UNION ALL
  SELECT 'Buchanan', 50, 13)

我想循环它,以便在带有WHERE子句的 for 循环中保存一个由日期共享的表。 例如,将OpponentID等于70按日期分片的所有行保存为

  • tablename_20200801
  • tablename_20200901
  • tablename_20201001

我该怎么做? 我在下面有一个示例,但这不起作用,您能解释一下缺少什么吗?


DECLARE end_of_month date;
DECLARE final_snapshot_date DEFAULT DATE '2020-10-01';
DECLARE initial_snapshot_date date DEFAULT DATE '2020-08-01';
DECLARE formatted_date STRING;

-- FOR LOOP, is working
FOR date_suffix in (
  select * from UNNEST(GENERATE_DATE_ARRAY(initial_snapshot_date, final_snapshot_date, INTERVAL 1 MONTH)) date
)
DO

  SET formatted_date = FORMAT_DATE("%Y%m%d", date_suffix.date);
  SET end_of_month = LAST_DAY(date_suffix.date);
  IF 
    date_suffix.date > final_snapshot_date THEN
    LEAVE; -- kill
  END IF;
  -- create some variables, through a table called tablename. this is the table we want to shard with formatted_date and save
  EXECUTE IMMEDIATE
    FORMAT("CREATE OR REPLACE TABLE project_id.dataset_id.tablename_%s", formatted_date);
    FROM `project_id.dataset_id. example_table `
    WHERE OpponentID = 77

END FOR;

如果我理解正确,您想创建表并用OpponentID = 77的行填充它们。 如果没有,请告诉我,以便我删除我的答案。

有关实施,请参阅下面的查询:

DECLARE end_of_month date;
DECLARE final_snapshot_date DEFAULT DATE '2020-10-01';
DECLARE initial_snapshot_date date DEFAULT DATE '2020-08-01';
DECLARE formatted_date STRING;

FOR date_suffix IN (select * from unnest(GENERATE_DATE_ARRAY(initial_snapshot_date, final_snapshot_date, INTERVAL 1 MONTH)) date)

DO
  SET formatted_date = FORMAT_DATE("%Y%m%d", date_suffix.date);
  SET end_of_month = LAST_DAY(date_suffix.date);
  IF 
    date_suffix.date > final_snapshot_date THEN
    LEAVE; -- kill
  END IF;
  EXECUTE IMMEDIATE FORMAT (
    """
    CREATE OR REPLACE TABLE `project_id.dataset_id.tablename_%s` AS (
    SELECT * FROM `project_id.dataset_id.example_table` where OpponentID = 77  
    )
    """,formatted_date);
END FOR;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM