我在BigQuery中有一个表,如下所示:

ID  OPTIONS   A   B   C   D   E
1  ['A','C'] 0.1 0.9 0.3 0.7  0
2  ['B','C'] 0.2 0.3 0.4 0.6  1
3  ['A','D'] 0.3 0.4 0.5 0.1  0.6

我想从‘Options’中获得每行的最大选项,例如:

ID  OPTIONS   A   B   C   D   E    MAX_OPTION
1  ['A','C'] 0.1 0.9 0.3 0.7  0.      C
2  ['B','C'] 0.2 0.3 0.4 0.6  1       C
3  ['A','D'] 0.3 0.4 0.5 0.1  0.6     A

这就是我try 过的:

SELECT 
  ID,
  GREATEST(
    IF('A' IN UNNEST(REGEXP_EXTRACT_ALL(bonus_options, r'"([^"]+)"')), A, -99999), 
    IF('B' IN UNNEST(REGEXP_EXTRACT_ALL(bonus_options, r'"([^"]+)"')), B, -99999), 
    IF('C' IN UNNEST(REGEXP_EXTRACT_ALL(bonus_options, r'"([^"]+)"')), C, -99999), 
    IF('D' IN UNNEST(REGEXP_EXTRACT_ALL(bonus_options, r'"([^"]+)"')), D, -99999), 
    IF('E' IN UNNEST(REGEXP_EXTRACT_ALL(bonus_options, r'"([^"]+)"')), E, -99999),
  ) AS MAX_OPTION
FROM 
  `TABLE`

但我在MAX_OPTION中得到NULL. 我能做什么?

推荐答案

    SELECT 
      * EXCEPT (MAX_OPTION), 
      CASE
        WHEN A=MAX_OPTION THEN 'A'
        WHEN B=MAX_OPTION THEN 'B'
        WHEN C=MAX_OPTION THEN 'C'
        WHEN D=MAX_OPTION THEN 'D'
        WHEN E=MAX_OPTION THEN 'E'
      END as MAX_OPTION
    FROM (
    SELECT 
      ID,
      GREATEST(
        IF('A' IN UNNEST(REGEXP_EXTRACT_ALL(bonus_options, r'"([^"]+)"')), A, -99999), 
        IF('B' IN UNNEST(REGEXP_EXTRACT_ALL(bonus_options, r'"([^"]+)"')), B, -99999), 
        IF('C' IN UNNEST(REGEXP_EXTRACT_ALL(bonus_options, r'"([^"]+)"')), C, -99999), 
        IF('D' IN UNNEST(REGEXP_EXTRACT_ALL(bonus_options, r'"([^"]+)"')), D, -99999), 
        IF('E' IN UNNEST(REGEXP_EXTRACT_ALL(bonus_options, r'"([^"]+)"')), E, -99999),
      ) AS MAX_OPTION
    FROM 
      `TABLE`)

Sql相关问答推荐

从以前的非空值行中获取值

使用Lead获取下一个不同的日期

如何使用WSO2将空值传递给我的SQL Server存储过程?

使用占位符向SQL INSERT查询添加 case

每组显示一行(表1中的分组值),表2中的不同列表用逗号分隔

我可以在SQL的IN子句中使用比子查询包含的值更少的值吗?

使用generate_series()时,LEFT联接缺少日期/间隔

我需要一个regexp_like来只验证字母D或T、数字和管道

了解多个分组集

从结果SQL查询中排除空值

合并分层表SQL中的第一个非空、变化的空位置

按两列分组,并根据SQL中的条件返回第三个列值

当 ansible 变量未定义或为空时,跳过 sql.j2 模板中的 DELETE FROM 查询

对现有记录进行分组

具有分组条件的不同计数 (DAX)

列(值不为空)到其他有序列

获取所有用户的第一次和最后一次发货以及到达日期

如何对 SQL 表中的连续时间戳进行分组?

SQL日期比较用例;月初至今的报告

SQL:获取连接表的第一个项目