是否可以在 Union All BigQuery SQL 中让 where 子句引用另一个 where 子句?
Posted
技术标签:
【中文标题】是否可以在 Union All BigQuery SQL 中让 where 子句引用另一个 where 子句?【英文标题】:Is it possible to have a where clause reference another where clause in a Union All BigQuery SQL? 【发布时间】:2020-09-28 17:32:39 【问题描述】:我在玩 BQ SQL,想知道是否可以在整个 UNION ALL
语句中包含一个 WHERE
子句。因此,与其拥有多个不同的 WHERE
子句并且必须更改所有子句以运行单个查询,不如将其全部链接到单个 WHERE
子句,在该子句中,所有内容都将根据该单个更改进行更改。我在下面有一个虚拟数据作为我现在正在做的例子:
WITH Temp_A AS(
SELECT DISTINCT
Name,
Date,
Spend
FROM
Spend_Table
),
Temp_B AS(
SELECT DISTINCT
Name,
Date,
Revenue
FROM
Revenue_Table
),
Temp_C AS(
SELECT DISTINCT
Employee AS Name,
Date,
Paystub_Range,
Hourly,
Total_Amount
FROM
Employee_Pay
)
SELECT DISTINCT
a.Name,
a.Date,
a.Spend,
b.Revenue,
NULL AS Paystub_Range,
NULL AS Hourly,
NULL AS Total_Amount
FROM
Temp_A a
LEFT JOIN
Temp_B b
ON
a.Name = b.Name
AND a.Date = b.Date
WHERE
DATE BETWEEN '2020-09-01' AND '2020-09-15'
UNION ALL
SELECT DISTINCT
Name,
Date,
NULL AS Spend,
NULL AS Revenue,
Paystub_Range,
Hourly,
Total_Amount
FROM
Temp_C
WHERE
DATE BETWEEN '2020-09-01' AND '2020-09-15'
我想要完成或查看是否有可能是 WITH AS
数据的相同概念,但有一个 WHERE
语句或第二个 WHERE
语句引用第一个。因此,例如下面与上面相同类型的虚拟数据,只需执行SELECT DISTINCT
最终版本。相同的临时表/等。
)
SELECT DISTINCT
a.Name,
a.Date,
a.Spend,
b.Revenue,
NULL AS Paystub_Range,
NULL AS Hourly,
NULL AS Total_Amount
FROM
Temp_A a
LEFT JOIN
Temp_B b
ON
a.Name = b.Name
AND a.Date = b.Date
WHERE
DATE BETWEEN '2020-09-01' AND '2020-09-15'
UNION ALL
SELECT DISTINCT
Name,
Date,
NULL AS Spend,
NULL AS Revenue,
Paystub_Range,
Hourly,
Total_Amount
FROM
Temp_C
WHERE
DATE BETWEEN @DateA AND @DateB
或者是否有另一种我忽略的方法可以使这更简单?任何帮助将不胜感激,因为我仍在尽我所能学习这方面的知识,以便从长远来看更容易。如果我需要扩展任何细节,请告诉我,这只是虚拟数据。
提前谢谢你!!
【问题讨论】:
【参考方案1】:您可以通过两种方式实现:(1) 脚本变量和 (2) 参数化查询。
(1) 脚本变量 - 声明变量然后在查询中使用它们
DECLARE from_date DATE DEFAULT '2020-09-01';
DECLARE to_date DATE DEFAULT '2020-09-15';
...your query...
WHERE DATE BETWEEN from_date AND to_date
...rest of the query...
(2) 参数化查询 - BigQuery UI 不支持,但您可以在 BQ CLI 和客户端库上使用它们。
例如,如果使用 BQ CLI,您可以执行以下操作:
bq query \
--use_legacy_sql=false \
--parameter='from_date:DATE:2020-09-01' \
--parameter='to_date:DATE:2020-09-15' \
'SELECT
...your query...
WHERE DATE BETWEEN @from_date AND @to_date
...rest of the query...'
【讨论】:
以上是关于是否可以在 Union All BigQuery SQL 中让 where 子句引用另一个 where 子句?的主要内容,如果未能解决你的问题,请参考以下文章
Bigquery 使用 Union All 和通配符删除查询
BigQuery 中的 UNION ALL 或 CONCATENATE 数据集
Bigquery:根据不同的 date_trunc 多次运行查询并将结果合并,而不是多个 UNION ALL