带有子句的 BigQuery

问题描述

目前我正在处理一个如下所示的查询

WITH subquery1 AS ( 
   SELECT ...
   FROM rawdata
   WHERE DATE(_PARTITIONTIME) = "2021-03-09"
),subquery2 AS ( 
   SELECT ...
   FROM subquery 1
),subquery3 AS ( 
   SELECT ...
   FROM subquery1 join subquery2 
)
SELECT * FROM subquery3

在我的实际查询中,我有 5 个子查询,它们都建立在以前的查询之上。 该查询运行良好,我希望将其作为视图,以便我可以在其他查​​询中使用它。

有没有办法在调用视图时控制第一个查询中的分区过滤器?在某些情况下,我只想有一个星期,而在其他情况下,我想要几个月。

解决方法

很遗憾,您无法在 BigQuery 上参数化视图,但您可以编写 Python 脚本并参数化 BigQuery SQL。 下面给出了一个示例代码,其中我消耗了 SQL 的多个输入并根据输入值对其进行处理:-

from dateutil.parser import parse
import datetime,sys
from google.cloud import bigquery
from datetime import datetime,timedelta

Dataset_Table_name = sys.argv[1]
coll_name = sys.argv[2]
date_ip = sys.argv[3]
no_day = sys.argv[4]

arch_date = (datetime.strptime(date_ip,'%Y-%m-%d') - timedelta(int(no_day))).strftime('%Y-%m-%d')

stream_query = """DELETE FROM `ikea-itsd-ml.""" + Dataset_Table_name + """` WHERE """ + coll_name + """ < '""" + arch_date + """'"""

print (stream_query)

stream_client = bigquery.Client()
stream_Q = stream_client.query(stream_query)
stream_data_df = stream_Q.to_dataframe()