Невозможно удалить некоторые поля с помощью 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'
Другие вопросы по тегам