0

我有一个嵌套表,我无法访问使用标准 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'

有错误

“错误:无法在 [9:59] 访问类型为 ARRAY> 的值的字段 sku”

然而

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`

失败并出现与上述相同的错误。

4

2 回答 2

1

如果您的目标是为每个数组元素获取一行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'
于 2017-10-19T19:12:46.133 回答
1

扩展 Elliott 的答案-我认为在这里您首先需要 UNNEST,但随后您很可能需要汇总您sku的 . 否则你会得到相当冗余(扁平化)的输出

我觉得下面是您可能需要的 - 它适用于 BigQuery 标准 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 的列表,以及金额和货币

根据 Elliott 的评论/建议添加

#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'
于 2017-10-19T19:55:17.517 回答