Подзапросы google bigQuery для присоединений - PullRequest
1 голос
/ 08 мая 2020

У меня есть следующая таблица. в основном упрощенная версия моей таблицы. Мне нужно объединить несколько столбцов, я объясню, что я пытаюсь сделать, а также то, что я написал до сих пор.

tableName

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

вариации могут быть похожи на начинки для пиццы, каждая вариация имеет количество, скажем, вегетарианские ie начинки стоят 10 центов, а мясные начинки стоят 20 центов для простоты

, поэтому теперь я пытаюсь собрать некоторые данные для этой таблицы

Я пытаюсь получить

  • количество напечатанных элементов (элементы, где print = TRUE)
  • количество распечатанных элементов (элементы, где напечатано = FALSE)
  • общая стоимость всех позиций
  • общая цена всех вариантов
  • общее количество уникальных корзин для определенного c foodType

Это запрос I иметь:

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 Ответ

2 голосов
/ 08 мая 2020

Ниже для BigQuery Standard 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) на самом деле не тот же тип подзапроса, что и в исходном запросе. Скорее, здесь для каждой строки вы запрашиваете ее массив, чтобы найти сумму суммы в этой строке, которая затем агрегируется до общей суммы ...
Надеюсь, вы ее получите

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...