簡體   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