Google bigquery 在groupby中的许多列上应用BigQuery函数
EDIT:我用一个更简单的例子更新了这个问题,使用了一个不带Google bigquery 在groupby中的许多列上应用BigQuery函数,google-bigquery,Google Bigquery,EDIT:我用一个更简单的例子更新了这个问题,使用了一个不带STRUCTs的表 我来自一个R背景,在那里,apply函数家族使一次在多个列上应用一个函数变得非常容易。在下面更新的示例中,我有一个包含多个“pctile”列的表,这些列中的数字从1到100不等: WITH wide_stats AS ( SELECT 'joe' name, 'bills' team, false as is_o, 7 as stat1, 95 as stat1_pctile,
STRUCT
s的表
我来自一个R背景,在那里,apply
函数家族使一次在多个列上应用一个函数变得非常容易。在下面更新的示例中,我有一个包含多个“pctile”列的表,这些列中的数字从1到100不等:
WITH
wide_stats AS (
SELECT
'joe' name, 'bills' team, false as is_o,
7 as stat1, 95 as stat1_pctile,
9 as stat2, 82 as stat2_pctile,
3 as stat3, 67 as stat3_pctile
UNION ALL
SELECT
'joe', 'bills', true as is_o,
1 as stat1, 37 as stat1_pctile,
5 as stat2, 54 as stat2_pctile,
2 as stat3, 17 as stat3_pctile
UNION ALL
SELECT
'tim' name, 'jets' team, false as is_o,
17 as stat1, 65 as stat1_pctile,
12 as stat2, 85 as stat2_pctile,
13 as stat3, 69 as stat3_pctile
UNION ALL
SELECT
'tim' name, 'jets' team, true as is_o,
15 as stat1, 32 as stat1_pctile,
14 as stat2, 56 as stat2_pctile,
12 as stat3, 16 as stat3_pctile
)
SELECT * FROM wide_stats
对于以\u pctile
结尾的每一列,我想运行函数if(is_o,100-col_val,col_val)
,它只需(a)检查is_o
列是否为真,以及(b)如果为真,则对列中已有的任何值执行100-col_val
,否则保持列不变。我希望实现这一点,而不必为以\u pctile
结尾的每一列手动写出这段代码,因为我的实际、非常广泛的数据中有100多条这样的代码
在此方面的任何帮助都将不胜感激!虽然这是BQ而不是R,但这种类型的apply
功能将对我手头的任务有很大帮助
谢谢 不幸的是,您为选择使用的不是最佳模式付出了代价 我在这里看到的唯一选项是展平数据,使每个键(stat1、stat2、stat3等)位于单独的行上,如下面的示例所示(BigQuery标准SQL) 如果要应用于您问题中的样本数据-结果为
Row name team is_o key value key_pctile value_pctile
1 joe bills false stat1 7 stat1_pctile 95
2 joe bills false stat2 9 stat2_pctile 82
3 joe bills true stat1 1 stat1_pctile 63
4 joe bills true stat2 5 stat2_pctile 46
5 tim jets false stat1 17 stat1_pctile 65
6 tim jets false stat2 12 stat2_pctile 85
7 tim jets true stat1 15 stat1_pctile 68
8 tim jets true stat2 14 stat2_pctile 44
正如您所看到的,如果您首先将表展平,那么查询将非常简单
#standardSQL
SELECT * REPLACE(IF(is_o, 100 - value_pctile, value_pctile) AS value_pctile)
FROM flattened_table
注意:出于所有实际目的-无论如何,你都需要将你需要的结果展平,否则你会经常面临与此相同的问题
#standardSQL
SELECT * REPLACE(IF(is_o, 100 - value_pctile, value_pctile) AS value_pctile)
FROM flattened_table