BigQuery无法在SELECT * REPLACE中使用解析功能

时间:2019-11-13 07:27:45

标签: google-bigquery

对于我的一个大型数据库项目,我采用了一种结构,该结构使用嵌套结构构建表,并将这些表组合在一起(再次使用结构)到一个大表中。我发现这种方法可以极大地干燥我的代码,并减少了多次执行各种任务的需要。

但是,我正在努力修改结构中的内容,特别是在尝试使用解析函数rankpercent_rank时。这个问题基于this previous question of mine,我在下面添加了一个可重现的示例:

#standardSQL
WITH wide_stats AS (
  SELECT 'joe' name, 'bills' team,
    STRUCT(STRUCT(7 AS fga, 5 AS fgm) AS o, STRUCT(8 AS fga, 3 AS fgm) AS d) AS t1,
    STRUCT(STRUCT(3 AS fga, 4 AS fgm) AS o, STRUCT(9 AS fga, 2 AS fgm) AS d) AS t2 UNION ALL 
  SELECT 'nick' name, 'jets' team,
    STRUCT(STRUCT(12 AS fga, 7 AS fgm) AS o, STRUCT(13 AS fga, 7 AS fgm) AS d) AS t1,
    STRUCT(STRUCT(15 AS fga, 7 AS fgm) AS o, STRUCT(22 AS fga, 7 AS fgm) AS d) AS t2
)
SELECT * REPLACE (
  (SELECT AS STRUCT t1.* REPLACE (
    (SELECT AS STRUCT 
      t1.o.*,
      SAFE_DIVIDE(wide_stats.t1.o.fgm, wide_stats.t1.o.fga) AS fg_pct,
      rank() over(order by wide_stats.t1.o.fgm asc) as fgm_rank
    ) 
    AS o))
  AS t1)
FROM wide_stats

由于以SELECT without FROM clause cannot use analytic functions at [13:6]开头的行,因此返回以下错误rank() over ...

我喜欢在BQ中使用STRUCT,但是无法在以后的查询中使用解析函数来更新结构,这是目前对我要完成的工作的重大限制。任何帮助,我们将不胜感激!

谢谢!

1 个答案:

答案 0 :(得分:1)

以下应该可以解决问题(BigQuery Standard SQL)

#standardSQL
WITH wide_stats AS (
  SELECT 'joe' name, 'bills' team,
    STRUCT(STRUCT(7 AS fga, 5 AS fgm) AS o, STRUCT(8 AS fga, 3 AS fgm) AS d) AS t1,
    STRUCT(STRUCT(3 AS fga, 4 AS fgm) AS o, STRUCT(9 AS fga, 2 AS fgm) AS d) AS t2 UNION ALL 
  SELECT 'nick' name, 'jets' team,
    STRUCT(STRUCT(12 AS fga, 7 AS fgm) AS o, STRUCT(13 AS fga, 7 AS fgm) AS d) AS t1,
    STRUCT(STRUCT(15 AS fga, 7 AS fgm) AS o, STRUCT(22 AS fga, 7 AS fgm) AS d) AS t2
), temp AS (
  SELECT *, RANK() OVER(ORDER BY wide_stats.t1.o.fgm ASC) AS fgm_rank 
  FROM wide_stats
)
SELECT * EXCEPT(fgm_rank) REPLACE (
  (SELECT AS STRUCT t1.* REPLACE (
    (SELECT AS STRUCT 
      t1.o.*,
      SAFE_DIVIDE(t1.o.fgm, t1.o.fga) AS fg_pct,
      fgm_rank
    ) 
    AS o))
  AS t1)    
FROM temp