如何在 BigQuery 中构建模块化查询?
How to build modular queries in BigQuery?
我有一些有用的查询,我想构建一些需要它们作为子查询的更复杂的查询。我可以叫他们的名字吗?
- 我看到了 'save view' 选项并且能够构建使用已保存视图的新查询。
每次顶级查询使用此方法时,是否通过重新执行相关查询来刷新已保存的视图?或者它只是一个命名查询结果,我每次都必须重新运行才能刷新?
- 以模块化方式构建查询的其他建议?例如,当我更改 select 的天数范围时,我希望所有子查询都使用该范围。
在编程中要么使用启动子要么使用全局变量,如何在 BigQuery 中做到这一点?
虽然由于其广泛性,很难解决您的问题。对于每个疑问,我都会用一般准则和示例来回答他们。
关于您的第一个问题,关于子查询和通过别名调用查询。我对此有 2 个考虑:
1) 您可以使用带有 WITH. 的子查询 所以,您在数据中执行转换,保存它在临时 table 中并在以下(子)查询中引用它。而且,每次你 运行 代码时,所有的查询都会被执行。下面是一个例子,
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 public 数据集),
#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 语句中使用它的输出 (a temporary table)。我必须指出,每次调用过程时,它都会执行查询。
关于您关于已保存视图的问题: 每次您 运行 视图都会更新。请参考documentation.
最后,关于在查询中使用参数和全局变量的最后一个问题: 你可以使用 scripting in BigQuery in order to DECLARE and SET 变量。因此,例如,您可以在更改过滤器参数时利用。下面是一个使用 public a public 数据集的用法示例,
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 语句中进行。
注:有什么具体问题可以另开一个帖子或者评论区问我
我有一些有用的查询,我想构建一些需要它们作为子查询的更复杂的查询。我可以叫他们的名字吗?
- 我看到了 'save view' 选项并且能够构建使用已保存视图的新查询。
每次顶级查询使用此方法时,是否通过重新执行相关查询来刷新已保存的视图?或者它只是一个命名查询结果,我每次都必须重新运行才能刷新?
- 以模块化方式构建查询的其他建议?例如,当我更改 select 的天数范围时,我希望所有子查询都使用该范围。 在编程中要么使用启动子要么使用全局变量,如何在 BigQuery 中做到这一点?
虽然由于其广泛性,很难解决您的问题。对于每个疑问,我都会用一般准则和示例来回答他们。
关于您的第一个问题,关于子查询和通过别名调用查询。我对此有 2 个考虑:
1) 您可以使用带有 WITH. 的子查询 所以,您在数据中执行转换,保存它在临时 table 中并在以下(子)查询中引用它。而且,每次你 运行 代码时,所有的查询都会被执行。下面是一个例子,
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 public 数据集),
#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 语句中使用它的输出 (a temporary table)。我必须指出,每次调用过程时,它都会执行查询。
关于您关于已保存视图的问题: 每次您 运行 视图都会更新。请参考documentation.
最后,关于在查询中使用参数和全局变量的最后一个问题: 你可以使用 scripting in BigQuery in order to DECLARE and SET 变量。因此,例如,您可以在更改过滤器参数时利用。下面是一个使用 public a public 数据集的用法示例,
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 语句中进行。
注:有什么具体问题可以另开一个帖子或者评论区问我