Создайте представление BigQuery VIEW для каждого результата запроса. - PullRequest
0 голосов
/ 16 июня 2020

Я создал этот запрос:

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;

Заранее спасибо

1 Ответ

1 голос
/ 17 июня 2020

Это скрипт, который запускается внутри 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 с сгенерированным строка, создающая представление.

...