虽然由于其广泛性,很难解决您的问题。对于每个疑问,我都会用一般准则和示例来回答他们。
关于您的第一个问题,关于子查询和通过别名调用查询。我对这些有两个考虑:
1) 您可以使用带有WITH 的子查询。因此,您可以在数据中执行转换,将其保存在临时表中并在下面引用它(子)查询。此外,每次运行代码时,都会执行所有查询。下面是一个例子,
WITH data as (
SELECT "Alice" AS name, 39 AS age, "San Francisco" AS city UNION ALL
SELECT "Marry" AS name, 35 AS age, "San Francisco" AS city UNION ALL
SELECT "Phill" AS name, 18 AS age, "Boston" AS city UNION ALL
SELECT "Robert" AS name, 10 AS age, "Tampa" AS city
),
greater_30 AS (
SELECT * FROM data
WHERE age > 30
),
SF_30 AS (
SELECT * FROM greater_30
WHERE city = "San Francisco"
)
SELECT * FROM SF_30
和输出,
Row name age city
1 Alice 39 San Francisco
2 Marry 35 San Francisco
2) 创建Stored Procedure: 过程是语句块,可以从其他查询中调用,也可以递归执行(在另一个过程中调用一个过程)。为了创建和存储过程,您必须指定将保存它的项目和数据集。还有,它的名字。下面是一个示例(使用 BigQuery 公共数据集),
#creating the procedure
CREATE or replace PROCEDURE project_id.ataset.chicago_taxi(IN trip_sec INT64, IN price INT64)
BEGIN
CREATE TEMP TABLE taxi_rides AS
SELECT * FROM `bigquery-public-data.chicago_taxi_trips.taxi_trips`
WHERE trip_seconds > trip_sec and fare >price
LIMIT 10000
;
END;
现在,您可以使用CALL 调用该过程。如下:
DECLARE trip_sec INT64 DEFAULT 30;
DECLARE price INT64 DEFAULT 30;
CALL `project_id.ataset.chicago_taxi`(trip_sec, price);
SELECT max(fare) AS max_fare,payment_type FROM taxi_rides
GROUP BY payment_type
还有输出,
Row max_fare payment_type
1 463.45 Cash
2 200.65 Credit Card
请注意,该过程保存在数据集中。然后我们使用 CALL 调用它并在下一个 select 语句中使用它的输出(temporary table)。我必须指出,每次调用该过程时,它都会执行查询。
关于您关于已保存视图的问题:视图会在您每次运行时更新。请参考documentation。
最后,关于在查询中使用参数和全局变量的最后一个问题:您可以在 BigQuery 中使用 scripting 以将 DECLARE 和 SET 一个变量。因此,您可以在更改过滤器参数时利用这些优势。下面是一个使用公共公共数据集的使用示例,
DECLARE time_s timestamp;
SET time_s= timestamp(DATETIME "2016-01-01 15:30:00");
SELECT * FROM `bigquery-public-data.chicago_taxi_trips.taxi_trips`
WHERE trip_start_timestamp > time_s
LIMIT 10000
注意,每次需要更改过滤器时,都可以从 SET 语句中进行。
注意:如果您有任何具体问题,请打开另一个线程,或者您可以在评论部分询问我。