首页 > 解决方案 > 为查询中的每个结果创建一个 BigQuery VIEW

问题描述

我创建了这个查询:

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

有没有办法为每个值(每个项目)创建一个视图?我正在尝试使用 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;

提前致谢

标签: google-bigqueryuser-defined-functionsgcloud

解决方案


这是一个在 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生成的字符串来创建视图。


推荐阅读