Stored procedures 挣扎着在BigQuery中运行我的第一个存储过程(pivot表受Felipe Hoffa在BigQuery文章中的Easy pivot()启发)

Stored procedures 挣扎着在BigQuery中运行我的第一个存储过程(pivot表受Felipe Hoffa在BigQuery文章中的Easy pivot()启发),stored-procedures,google-bigquery,dynamic-sql,Stored Procedures,Google Bigquery,Dynamic Sql,我一直在关注Felipe Hoffa的博客文章Easy pivot in BigQuery,我成功地调用了他的过程并复制了他的示例计算。但是,因为我最终感兴趣的数据是在欧盟托管的,所以我无法逐字调用他的过程,因此,我一直试图创建代码副本并将其运行到我自己的BigQuery项目文件夹中,但没有成功 据我所知,所涉及的步骤如下 把代码复制到这里 更新项目ID和数据集,例如,交换掉'fhoff.x'的每个实例。用我的BigQuery信息等等。并在我自己的BigQuery帐户中创建存储过程 运行代码,调

我一直在关注Felipe Hoffa的博客文章Easy pivot in BigQuery,我成功地调用了他的过程并复制了他的示例计算。但是,因为我最终感兴趣的数据是在欧盟托管的,所以我无法逐字调用他的过程,因此,我一直试图创建代码副本并将其运行到我自己的BigQuery项目文件夹中,但没有成功

据我所知,所涉及的步骤如下

把代码复制到这里

更新项目ID和数据集,例如,交换掉'fhoff.x'的每个实例。用我的BigQuery信息等等。并在我自己的BigQuery帐户中创建存储过程

运行代码,调整新位置

比如:

CALL `*blah*.matt.pivot`(  
    'bigquery-public-data.iowa_liquor_sales.sales' # source table
  , 'blah.matt.test2' # destination table
  , ['date'] # row_ids
  , 'store_number' # pivot_col_name
  , 'sale_dollars' # pivot_col_value
  , 5 # max_columns
  , 'SUM' # aggregation
  , '' # optional_limit
  );
不幸的是,当我这样做时,我遇到了以下错误

无效的执行立即sql字符串选择字符串| AGG'SUMIF'| |@pivot| u col|u name | |'='| | x.value |'、'| | pivot| u col u value | | | |'、null e| | | | | | blah.matt.normalize u col u| namex.value从UNNEST选择大约| TOP(u COUNTstore u |存储区|数值,@max)列从bigquery-[废话,马特,枢轴:5:5]

有人能给我建议吗?我是一个大查询的新手,不知道我在哪里出轨了。如果这是一个超级基本的问题,我道歉

非常感谢您的时间和帮助

问候,,
Matt

您的问题很可能与未正确引用project.dataset或只是有打字错误等有关-为了安全起见,请按以下操作,只需从下面复制粘贴即可

CREATE OR REPLACE FUNCTION
`blah.matt.normalize_col_name`(col_name STRING) AS (
  REGEXP_REPLACE(col_name,r'[/+#|]', '_')
);

CREATE OR REPLACE PROCEDURE `blah.matt.pivot`(
  table_name STRING
  , destination_table STRING
  , row_ids ARRAY<STRING>
  , pivot_col_name STRING
  , pivot_col_value STRING
  , max_columns INT64
  , aggregation STRING
  , optional_limit STRING
  )
BEGIN
  DECLARE pivotter STRING;

  EXECUTE IMMEDIATE (
    "SELECT STRING_AGG(' "||aggregation
    ||"""(IF('||@pivot_col_name||'="'||x.value||'", '||@pivot_col_value||', null)) e_'||`blah.matt.normalize_col_name`(x.value))
   FROM UNNEST((
       SELECT APPROX_TOP_COUNT("""||pivot_col_name||", @max_columns) FROM `"||table_name||"`)) x"
  ) INTO pivotter
  USING pivot_col_name AS pivot_col_name, pivot_col_value AS pivot_col_value, max_columns AS max_columns;

  EXECUTE IMMEDIATE (
   'CREATE OR REPLACE TABLE `'||destination_table
   ||'` AS SELECT '
   ||(SELECT STRING_AGG(x) FROM UNNEST(row_ids) x)
   ||', '||pivotter
   ||' FROM `'||table_name||'` GROUP BY '
   || (SELECT STRING_AGG(''||(i+1)) FROM UNNEST(row_ids) WITH OFFSET i)||' ORDER BY '
   || (SELECT STRING_AGG(''||(i+1)) FROM UNNEST(row_ids) WITH OFFSET i)
   ||' '||optional_limit
  );
END;
注意:只需用项目和数据集各自的专有名称替换blah和matt即可

另外,显然,你可以避免所有这些头痛,只需致电Felipe公开的proc-fhofa.x.pivot即可
但我同意,在本地安装这些程序将允许根据您潜在的特定需求调整这些程序,并进一步改进和编码-我在这里仍然看到很大的空间:o

最有可能您的问题与未正确引用您的project.dataset或只是有拼写错误等有关-为了安全起见,只需从以下位置复制粘贴即可下面

CREATE OR REPLACE FUNCTION
`blah.matt.normalize_col_name`(col_name STRING) AS (
  REGEXP_REPLACE(col_name,r'[/+#|]', '_')
);

CREATE OR REPLACE PROCEDURE `blah.matt.pivot`(
  table_name STRING
  , destination_table STRING
  , row_ids ARRAY<STRING>
  , pivot_col_name STRING
  , pivot_col_value STRING
  , max_columns INT64
  , aggregation STRING
  , optional_limit STRING
  )
BEGIN
  DECLARE pivotter STRING;

  EXECUTE IMMEDIATE (
    "SELECT STRING_AGG(' "||aggregation
    ||"""(IF('||@pivot_col_name||'="'||x.value||'", '||@pivot_col_value||', null)) e_'||`blah.matt.normalize_col_name`(x.value))
   FROM UNNEST((
       SELECT APPROX_TOP_COUNT("""||pivot_col_name||", @max_columns) FROM `"||table_name||"`)) x"
  ) INTO pivotter
  USING pivot_col_name AS pivot_col_name, pivot_col_value AS pivot_col_value, max_columns AS max_columns;

  EXECUTE IMMEDIATE (
   'CREATE OR REPLACE TABLE `'||destination_table
   ||'` AS SELECT '
   ||(SELECT STRING_AGG(x) FROM UNNEST(row_ids) x)
   ||', '||pivotter
   ||' FROM `'||table_name||'` GROUP BY '
   || (SELECT STRING_AGG(''||(i+1)) FROM UNNEST(row_ids) WITH OFFSET i)||' ORDER BY '
   || (SELECT STRING_AGG(''||(i+1)) FROM UNNEST(row_ids) WITH OFFSET i)
   ||' '||optional_limit
  );
END;
注意:只需用项目和数据集各自的专有名称替换blah和matt即可

另外,显然,你可以避免所有这些头痛,只需致电Felipe公开的proc-fhofa.x.pivot即可
但我同意,在本地安装这些程序将允许根据您潜在的特定需求调整这些程序,并进一步改进和编码-我在这里仍然看到了很大的空间:o

谢谢您,米哈伊尔!我复制粘贴了您的代码,并且工作顺利:-出于好奇,您提到您认为Felipe的代码还有改进的空间。您愿意吗你介意指出你能感觉到什么可以改善吗?也可能会分享我应该检查的其他资源的建议。请考虑,如果它对你有用的话,请接受答案!谢谢!再一次:谢谢你,米哈伊尔!我抄袭了你的代码,而且工作顺利。改善菲利佩的代码的房间。你介意指出你觉得什么可以改进吗?并且可能分享我对其他资源的建议,我应该检查一下。请考虑,接受答案,如果它为你工作的话:请接受!再次感谢: