Невозможно удалить некоторые поля с помощью Google BigQuery (стандарт)
У меня есть вложенная таблица, в которой я не могу получить доступ ко всем полям использования стандартного Google BigQuery.
Например, этот запрос не выполняется
SELECT *
FROM
(
SELECT
rev_info.user.id as player_id,
rev_info.purchase.total.currency as currency,
rev_info.purchase.total.amount as REV
,rev_info.purchase.virtual_items.items.sku as sku
FROM `gcs.rev`
)
WHERE currency = 'USD'
с ошибкой
"Ошибка: невозможно получить доступ к полю sku для значения с типом ARRAY> в [9:59]"
тем не мение
SELECT *
FROM
(
SELECT
rev_info.user.id as player_id,
rev_info.purchase.total.currency as currency,
rev_info.purchase.total.amount as REV
--,rev_info.purchase.virtual_items.items.sku as sku
FROM `gcs.rev`
)
WHERE currency = 'USD'
Этот запрос в порядке.
Также обратите внимание, что
SELECT
rev_info.purchase.virtual_items.items.sku as sku
FROM `gcs.rev`
завершается с той же ошибкой, что и выше.
2 ответа
Расширяя ответ Эллиотта - я думаю, что здесь вам сначала нужно UNNEST, но затем вам, скорее всего, нужно собрать обратно свои sku
"S. в противном случае вы получите довольно избыточный (плоский) вывод
Я чувствую ниже, что вам может понадобиться - это для BigQuery Standard SQL
#standardSQL
SELECT
player_id,
currency,
REV,
STRING_AGG(sku) SKUs
FROM (
SELECT
rev_info.user.id AS player_id,
rev_info.purchase.total.currency AS currency,
rev_info.purchase.total.amount AS REV,
item.sku AS sku
FROM `gcs.rev` t,
UNNEST(t.rev_info.purchase.virtual_items.items) item
)
WHERE currency = 'USD'
GROUP BY 1, 2, 3
Таким образом, все sku будут представлены в виде списка для данного player_id, а также суммы и валюты
Добавлено согласно комментарию / предложению Эллиотта
#standardSQL
SELECT
rev_info.user.id AS player_id,
rev_info.purchase.total.currency AS currency,
rev_info.purchase.total.amount AS REV,
(SELECT STRING_AGG(item.sku)
FROM UNNEST(t.rev_info.purchase.virtual_items.items) item
) AS SKUs
FROM `gcs.rev` t,
WHERE currency = 'USD'
Если ваша цель состоит в том, чтобы получить один ряд для каждого items
элемент массива, то вы можете использовать оператор запятой (соединения) между таблицей и rev_info.purchase.virtual_items.items
, Например,
SELECT *
FROM (
SELECT
rev_info.user.id as player_id,
rev_info.purchase.total.currency as currency,
rev_info.purchase.total.amount as REV,
item.sku as sku
FROM `gcs.rev` t,
t.rev_info.purchase.virtual_items.items item
)
WHERE currency = 'USD'