[英]How to pass a list of column names as variable in BigQuery without using "excute imemdiate"
我正在使用 CTE 查询,我想出了很多查询,这些查询本质上是相同的 function 但只有列名不同。 这是一个简化的例子
WITH org_sales AS (
SELECT 'team_a' AS teamId, 'CA' AS state, 12.1 AS sales, 'code1' AS jobCode
UNION ALL SELECT 'team_a','IL',13.1, 'code1'
UNION ALL SELECT 'team_a','CT',5.1,'code1'
UNION ALL SELECT 'team_a','FL',14.1,'code11'
UNION ALL SELECT 'team_a','MA',10.3,'code11'
UNION ALL SELECT 'team_b','AZ',8.1,'code2'
UNION ALL SELECT 'team_b','MO',6.2,'code2'
UNION ALL SELECT 'team_b','CA',7.3,'code2'
),
team_state_sales AS(
SELECT
teamId,state,AVG(sales) sales_avg from org_sales
GROUP BY
teamId,state
),
team_jobCode_sales AS(
SELECT
teamId,jobCode,AVG(sales) sales_avg from org_sales
GROUP BY
teamId,jobCode
)
SELECT teamId,state,jobCode from org_sales
teamId state jobCode sales
team_a CA code1 12.1
team_a IL code1 13.1
team_a CT code1 5.1
team_a FL code11 14.1
team_a MA code11 10.3
team_b AZ code2 8.1
team_b MO code2 6.2
team_b CA code2 7.3
我希望将 ['team_jobCode_sales','team_state_sales',...] 替换为一般查询,该查询将 GROUP BY 和 SELECT 的列列表作为变量(字符串),使用CREATE OR REPLACE TABLE FUNCTION并立即执行但是它确实如此不适用于 CTE。
伪代码就是这样的
CREATE OR REPLACE TABLE FUNCTION sales_avg(select_cols STRING,groupby_cols STRING)
AS
SELECT select_cols,
AVG(sales) sales_avg
FROM
org_sales
GROUP BY
group_cols
我知道可以做到的唯一方法是使用execute immediate ,还有其他方法吗?
我感觉你要找的是一个存储过程: https://cloud.google.com/bigquery/docs/procedures
它允许您创建编程方式来接收变量并允许轻松插入执行立即语句。
就像是:
CREATE OR REPLACE PROCEDURE mydataset.your_proc_name(select_cols STRING, group_by_cols STRING)
BEGIN
....
EXECUTE IMMEDIATE CONCAT("your select query ",select_cols," from .... where ... group by ",group_by_cols );
...
END
你可以在 bigquery 中使用存储过程做一些非常先进的事情,所以绝对值得一看。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.