对于我的一个大型数据库项目,我采用了一种结构,该结构使用嵌套结构构建表,并将这些表组合在一起(再次使用结构)到一个大表中。我发现这种方法可以极大地干燥我的代码,并减少了多次执行各种任务的需要。
但是,我正在努力修改结构中的内容,特别是在尝试使用解析函数rank
和percent_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
,但是无法在以后的查询中使用解析函数来更新结构,这是目前对我要完成的工作的重大限制。任何帮助,我们将不胜感激!
谢谢!
答案 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