Google bigquery 在groupby中的许多列上应用BigQuery函数

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,

EDIT:我用一个更简单的例子更新了这个问题,使用了一个不带
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