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 子查询加入的主要内容,如果未能解决你的问题,请参考以下文章

BigQuery - 使用子查询和OR语句加入多个条件

使用 SUM 过滤结果时,Google BigQuery 相关子查询错误

如何在 Datalab 的 api 中使用 Bigquery 中的子查询?

加入与子查询

BigQuery - 使用子查询和 OR 语句连接多个条件

Google BigQuery 要求 JOIN EACH,但我已经在使用它