为查询中的每个结果创建一个BigQuery VIEW

时间:2020-06-16 16:43:34

标签: google-bigquery user-defined-functions gcloud

我创建了此查询:

SELECT
(SELECT value from UNNEST(project.labels) where key = "project") as project,
ROUND(SUM(cost), 2) as cost
FROM cloud.dataset.billing_export
group by ar

它给我类似的东西

Row | project | cost

  1 | PJ1     | 23

  2 | PJ2     | 50

是否可以为每个值(每个项目)创建一个VIEW? 我正在尝试使用UDF,并且每个视图都必须具有基于项目的名称(例如:view_PJ1),并具有类似名称(但有很多错误):

LOOP
SET vars = (SELECT (SELECT value FROM UNNEST(project.labels) WHERE key = "project") AS project
            FROM FROM cloud.dataset.billing_export
            GROUP BY project);
  IF vars=null THEN
    LEAVE;
  END IF;
CREATE OR REPLACE VIEW `cloud`.`dataset`.AR
AS
SELECT DISTINCT
     (SELECT value from UNNEST(project.labels) where key = "project") as project,
     ROUND(SUM(cost), 2) as cost
     FROM cloud.dataset.billing_export
     WHERE project=vars
     GROUP BY project;
END LOOP;

预先感谢

1 个答案:

答案 0 :(得分:1)

这是一个在BigQuery中运行的脚本,该脚本生成4个视图-为每个视图指定一个来自SQL查询的名称:

DECLARE x INT64 DEFAULT 0;
DECLARE rs ARRAY<STRING>;

SET rs = (
  WITH data AS (SELECT i FROM `fh-bigquery.public_dump.numbers_255` WHERE i < 4)
  SELECT ARRAY_AGG( 
    'CREATE OR REPLACE VIEW `temp.number' || i
    ||'` AS SELECT i FROM `fh-bigquery.public_dump.numbers_255` WHERE i=' || i
  )  
  FROM data
);

LOOP
  EXECUTE IMMEDIATE(SELECT rs[OFFSET(x)]);
  SET x = x + 1;
  IF x >= ARRAY_LENGTH(rs) THEN
    LEAVE;
  END IF;
END LOOP;

秘密在于将EXECUTE IMMEDIATE与生成的字符串一起使用来创建视图。

相关问题