【发布时间】:2019-11-09 05:13:34
【问题描述】:
删除了此帖子的先前版本,以代替此带有可重现示例的清理帖子。我有以下格式的表格:
WITH wide_stats AS (
(
SELECT
'joe' name, 'bills' team,
struct(struct(7 as fga) as o, struct(8 as fga) as d) as t1,
struct(struct(3 as fga) as o, struct(9 as fga) as d) as t2,
struct(3 as pts, 9 as ast, 5 as reb) as t3,
7 tov, 3 blk
) UNION ALL (
SELECT 'nick' name, 'jets' team,
struct(struct(12 as fga) as o, struct(13 as fga) as d) as t1,
struct(struct(15 as fga) as o, struct(22 as fga) as d) as t2,
struct(13 as pts, 5 as ast, 15 as reb) as t3,
75 tov, 23 blk
)
)
SELECT
name, team, metric, SAFE_CAST(value AS FLOAT64) value
FROM (
SELECT
name, team,
REGEXP_REPLACE(SPLIT(pair, ':')[OFFSET(0)], r'^"|"$', '') metric,
REGEXP_REPLACE(SPLIT(pair, ':')[OFFSET(1)], r'^"|"$', '') value
FROM wide_stats,
UNNEST(SPLIT(REGEXP_REPLACE(to_json_string(wide_stats), r'{|}', ''))) pair
)
WHERE NOT LOWER(metric) IN ('name', 'team')
我正在努力将表格重塑为以下输出:
name team metric value
joe bills t1_o_fga 7
joe bills t1_d_fga 8
joe bills t2_o_fga 3
joe bills t2_d_fga 9
joe bills t3_pts 3
joe bills t3_ast 9
joe bills t3_reb 5
joe bills tov 7
joe bills blk 3
nick jets t1_o_fga 12
nick jets t1_d_fga 13
nick jets t2_o_fga 15
nick jets t2_d_fga 22
nick jets t3_pts 13
nick jets t3_ast 5
nick jets t3_reb 15
nick jets tov 75
nick jets blk 23
这个任务很容易解释 - 从宽到长,但在表中使用 struct 和嵌套的 structs。我在另一个 stackoveflow 帖子中的正则表达式工作是以错误的方式拆分列名,并且当前输出与它需要的不匹配。
行的顺序无关紧要。有了名字,不管它是 t1_o_fga 还是 t1-o-fga 还是 t1/o/fga,只要有一些分隔符并且清楚变量是什么。非常感谢任何帮助或指导,谢谢!
【问题讨论】:
-
一个在不使用 UDF 的情况下模拟 pandas.melt() 函数的查询:stackoverflow.com/a/62057616/13632099
标签: regex google-bigquery