google-bigquery - 为查询中的每个结果创建一个 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;
提前致谢
解决方案
这是一个在 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
生成的字符串来创建视图。
推荐阅读
- parsing - 解析树的 Python 列表
- mongodb - 为什么这个 msiexec.exe 命令在 powershell 中不起作用?
- c - 日期之间的差异(以秒为单位)
- ios - Firestore iOS - UITableview 中的删除功能
- python - bs4 findAll 找不到类标签
- linux - 模拟进入 Linux 接口的数据包
- couchdb - CouchDB 读取限制
- java - ByteArrayOutputStream 会发生什么样的 JVM 优化?
- yii2 - Yii2 从模型方法上传文件图片 beforeSave
- javascript - 在后台构建 dom-subtree