Как запросить денормализованную таблицу BigQuery для вывода вложенных и повторяющихся полей - PullRequest
0 голосов
/ 10 мая 2019

У меня есть данные, которые регулярно загружаются в базу данных BigQuery.Каждая строка представляет движение части инвентаря как часть выполнения заказа.

Информация о связанном заказе и "order_product" встроена в виде вложенных записей в строке.

Вот примернекоторые строки:

|----------|----------|----------|------------------|------------------------|---------------------|---------------------------------|
| move_id  | quantity | order.id | order_product.id | order_product.quantity | order_product.price |      item_reference_number      |
|----------|----------|----------|------------------|------------------------|---------------------|---------------------------------|
|    1     |    1     |     1    |         1        |            1           |           5         |               ABC               |
|----------|----------|----------|------------------|------------------------|---------------------|---------------------------------|
|    2     |    1     |     1    |         2        |            1           |           7         |               DEF               |
|----------|----------|----------|------------------|------------------------|---------------------|---------------------------------|
|    3     |    1     |     1    |         2        |            1           |           7         |               XYZ               |
|----------|----------|----------|------------------|------------------------|---------------------|---------------------------------|

Как видите, в таблице показаны три движения акций.Все, что связано с Заказом 1.

Заказ 1 состоит из одного заказа_продукта 1 и одного заказа_продукта 2. Заказ_продукта 1 состоит из одного движения запаса, Move_id 1 для позиции ABC.

Заказ_продукта 2 состоит из двух запасовдвижения, move_id 2 для элемента DEF и move_id 3 для элемента XYZ.

Как мне написать запрос для перевода этих данных в таблицу с правильными вложенными / повторяющимися полями?Другими словами, я хотел бы, чтобы данные выглядели так:

|-----------|------------------|------------------------|---------------------|------------------------|---------------------|----------------------------------|
| order_id  | order_product.id | order_product.quantity | order_product.price |      stock_move.id     | stock_move.quantity | stock_move.item_reference_number |
|-----------|------------------|------------------------|---------------------|------------------------|---------------------|----------------------------------|
|     1     |         1        |            1           |          5          |            1           |           1         |                ABC               |
|           |------------------|------------------------|---------------------|------------------------|---------------------|----------------------------------|
|           |         2        |            1           |          7          |            2           |           1         |                DEF               |
|           |                  |                        |                     |------------------------|---------------------|----------------------------------|
|           |                  |                        |                     |            3           |           1         |                XYZ               |
|-----------|------------------|------------------------|---------------------|------------------------|---------------------|----------------------------------|

Я читал этот пост , что, кажется, указывает на то, что ARRAY_AGG может быть тем, что мне нужно, но я не могу понять, как правильно использовать его для своей проблемы.

Я думаю, что моя проблема в том, что я изо всех сил стараюсь уменьшить количество вложенных order_products до одной строки для каждой, заполняя правильную вложенную/ повторное движение запаса для каждого заказа.

Возможно ли вообще сделать то, что я спрашиваю?Я действительно ценю любую помощь, чтобы указать мне правильное направление.

Ответы [ 2 ]

1 голос
/ 10 мая 2019

Будет ли следующий SQL соответствовать вашим ожиданиям?

Я создал stock_move способом order_product.

WITH original_table AS (
    SELECT 1 AS move_id, 1 AS quantity, STRUCT(1 AS id) AS `order`, STRUCT(1 AS id, 1 AS quantity, 5 AS price) AS order_product, "ABC" AS item_reference_number
    UNION ALL
    SELECT 2 AS move_id, 1 AS quantity, STRUCT(1 AS id) AS `order`, STRUCT(2 AS id, 1 AS quantity, 7 AS price) AS order_product, "DEF" AS item_reference_number
    UNION ALL
    SELECT 3 AS move_id, 1 AS quantity, STRUCT(1 AS id) AS `order`, STRUCT(2 AS id, 1 AS quantity, 7 AS price) AS order_product, "XYZ" AS item_reference_number
),

t1 AS (
    SELECT DISTINCT
        move_id,
        quantity,
        `order`.id AS order_id,
        order_product.id AS order_product_id,
        order_product.quantity AS order_product_quantity,
        order_product.price AS order_product_price,
        item_reference_number
    FROM original_table
),

t2 AS (
    SELECT
        order_id,
        order_product_id,
        order_product_quantity,
        order_product_price,
        ARRAY_AGG(STRUCT(move_id, quantity, item_reference_number) ORDER BY move_id) AS stock_move
    FROM t1
    GROUP BY order_id, order_product_id, order_product_quantity, order_product_price
),

t3 AS (
    SELECT
        order_id,
        ARRAY_AGG(STRUCT(order_product_id AS id, order_product_quantity AS quantity, order_product_price AS price, stock_move) ORDER BY order_product_id) AS order_product
    FROM t2
    GROUP BY order_id
)

SELECT * FROM t3
|-----------|------------------|------------------------|---------------------|----------------------------------|-----------------------------------|------------------------------------------------|
| order_id  | order_product.id | order_product.quantity | order_product.price | order_product.stock_move.move_id | order_product.stock_move.quantity | order_product.stock_move.item_reference_number |
|-----------|------------------|------------------------|---------------------|----------------------------------|-----------------------------------|------------------------------------------------|
|     1     |         1        |            1           |          5          |              1                   |           1                       |                ABC                             |
|           |------------------|------------------------|---------------------|----------------------------------|-----------------------------------|------------------------------------------------|
|           |         2        |            1           |          7          |              2                   |           1                       |                DEF                             |
|           |                  |                        |                     |----------------------------------|-----------------------------------|------------------------------------------------|
|           |                  |                        |                     |              3                   |           1                       |                XYZ                             |
|-----------|------------------|------------------------|---------------------|----------------------------------|-----------------------------------|------------------------------------------------|
1 голос
/ 10 мая 2019

Ниже для BigQuery Standard SQL

#standardSQL
SELECT order_id,
  ARRAY_AGG(product ORDER BY product.id) order_product,
  ARRAY_CONCAT_AGG(stock_move) stock_move
FROM (
  SELECT order_id, 
    STRUCT(order_product.id, order_product.quantity, order_product.price) product,
    ARRAY_AGG(STRUCT(move_id AS id, quantity AS quantity, item_reference_number AS item_reference_number)) stock_move
  FROM `project.dataset.table`
  GROUP BY order_id, order_product.id, order_product.quantity, order_product.price
  ORDER BY order_product.id -- <-- this is to make sure stock_move array is ordered as in your expected output  - but really not needed here
)
GROUP BY order_id

применительно к вашим образцам данных - приведенный выше результат дает, как показано ниже

enter image description here

Я не уверен, что это именно то, что вы имели в виду, поскольку ваши примеры все еще немного неоднозначны, но надеюсь, что это дает вам представление

Также обратите внимание: я предположил, что order.id в вашем примере на самом деле order_id иначе это не имеет особого смысла, но я могу ошибаться (как я уже говорил, ваш пример все еще неоднозначен "немного")

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