google bigQuery 子查询加入
Posted
技术标签:
【中文标题】google bigQuery 子查询加入【英文标题】:google bigQuery subqueries to joins 【发布时间】:2020-05-08 01:59:36 【问题描述】:我有下表。我的表的基本简化版本。我需要汇总几列,我将解释我正在尝试做什么以及我到目前为止所写的内容。
表名
food.id STRING NULLABLE
food.basket.id STRING NULLABLE
food.foodType STRING NULLABLE
food.price INTEGER NULLABLE
food.printed BOOLEAN NULLABLE
food.variations RECORD REPEATED
food.variations.id INTEGER REPEATED
food.variations.amount INTEGER NULLABLE
Sample data
id basket.id. foodType. price. printed. variations.id variations.amount
1. abbcd. JUNK. 100. TRUE. NULL. NULL
2. cdefg. PIZZA. 200. TRUE. 1234. 10
2345. 20
5678. 20
3. abbcd. JUNK. 200. FALSE. 1234. 10
4. uiwka. TOAST. 500. FALSE. NULL. NULL
变种可以像披萨浇头,每种变种都有数量,例如为简单起见,蔬菜浇头 10 美分,肉类浇头 20 美分
所以现在我正在尝试为这张表汇总一些数据
我正在努力获得
打印的项目数(打印的项目 = TRUE) 未打印的项目数(打印的项目 = FALSE) 所有项目的总成本 所有变体的总价 特定 foodType 的独特购物篮总数这是我的查询:
select SUM(CASE When item.printed = TRUE Then 1 Else 0 End ) as printed,
SUM(CASE When item.printed = FALSE Then 1 Else 0 End) as nonPrinted,
SUM(item.price) as price,
(select COUNT(DISTINCT(item.basket.id)) from tableName where itemType = "JUNK") AS baskets,
(select SUM(CASE when m.amount is NULL then 0 Else m.amount END) as variations_total from tableName, UNNEST(item.variations) as m) as variations
from tableName;
printed. unprinted. price. baskets. variations.
2. 2. 1000. 1. 60
现在我得到了我期望的结果。我想了解我们是否可以在不使用子查询并仅使用联接的情况下做到这一点?
【问题讨论】:
【参考方案1】:以下是 BigQuery 标准 SQL 并假设您的查询确实有效(这样说是因为您的数据示例不完全适合您提供的查询)
所以,下面两个子查询
(select COUNT(DISTINCT(item.basket.id)) from tableName where itemType = "JUNK") AS baskets,
(select SUM(CASE when m.amount is NULL then 0 Else m.amount END) as variations_total from tableName, UNNEST(item.variations) as m) as variations
可以替换为
COUNT(DISTINCT IF(itemType = "JUNK", item.basket.id, NULL)) AS baskets,
SUM((SELECT SUM(amount) FROM item.variations)) AS variations
信不信由你——但结果是一样的
Row printed nonPrinted price baskets variations
1 2 2 1000 1 60
所以,如您所见,您不需要子查询,也不需要在这里加入
注意:在第二行 - (SELECT SUM(amount) FROM item.variations)
与原始查询中的子查询类型不同。而是在这里为每一行查询其数组以查找该行中的金额总和,然后将其聚合为总和 ...
希望你能得到它
【讨论】:
感谢@Mikhail 的帮助和快速响应。你的回答几乎把我带到了我想去的地方。我看到的唯一问题是您的查询给了我错误,我不得不使用 SUM((SELECT SUM(amount) from UNNEST(item.variations))) 作为变体。如果我没有使用 UNNEST,就会出错。以上是关于google bigQuery 子查询加入的主要内容,如果未能解决你的问题,请参考以下文章
使用 SUM 过滤结果时,Google BigQuery 相关子查询错误