繁体   English   中英

如何在不使用“立即执行”的情况下将列名列表作为变量传递给 BigQuery

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM