是否可以在 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

UNION ALL 参数化查询

是否可以在 Postgres 中执行并行查询,使用 union all 查询分区表?

SqlSever基础 union 与 union all的区别,即 重复项是否全部显示