首页 文章

BigQuery SPLIT()和按结果分组

提问于
浏览
4

使用 SPLIT()NTH() ,我正在拆分字符串值,并将第二个子字符串作为结果 . 然后我想对结果进行分组 . 但是,当我将SPLIT()与GROUP BY结合使用时,它会不断给出错误:

Error: (L1:55): Cannot group by an aggregate

结果是一个字符串,为什么不能对它进行分组?

例如,这可以工作并返回正确的字符串:

SELECT NTH(2,SPLIT('FIRST-SECOND','-')) as second_part FROM [FOO.bar] limit 10

enter image description here

但是然后对结果进行分组不起作用:

SELECT NTH(2,SPLIT('FIRST-SECOND','-')) as second_part FROM [FOO.bar] GROUP BY second_part limit 10

enter image description here

4 回答

  • 4

    我最好的猜测是你可以通过使用子查询获得相同的结果 . 就像是 :

    SELECT * FROM (Select NTH(2,SPLIT('FIRST-SECOND','-')) as second_part FROM [FOO.bar] limit 10) GROUP BY second_part
    

    我想,系统在内部以聚合方式返回Nth

  • 5

    如果只有2个值由分隔符分隔,那么更简单的方法是使用REGEXP_EXTRACT:

    SELECT REGEXP_EXTRACT('FIRST-SECOND','-(.*)') as second_part 
    from [FOO.bar] 
    GROUP BY second_part 
    limit 10
    
  • 1

    我喜欢大卫的答案 - 有时使用RegEx可能会让分裂更加复杂 . 从split命令中提取第一个选项,然后GROUPing BY是一个非常常见的操作 . 我通常在BigQuery中执行此操作的方式是使用REGEXP_EXTRACT,如下所示:

    在这个简单的例子中,“splitme”列是以管道分隔的(|) .

    SELECT REGEXP_EXTRACT(splitme, r'(?U)^(.*)\|') AS title, COUNT(*) as c
    FROM [my_table]
    GROUP BY title;
    

    这意味着,将字符串从“splitme”的开头提取到第一次出现的管道(|) . “(?U)”是re2 RegEx引擎语法中的“非贪婪”匹配标志 . 如果没有此标志,如果有多个管道分隔值,则此RegEx将匹配最后一个管道之前的所有内容 .

  • 0

    在我的练习中,我通常使用类似下面的内容,其中N是“list”中的值数,以便跳过 .

    SELECT REGEXP_EXTRACT(string + '|',  r'(?U)^(?:.*\|){N}(.*)\|') AS substring
    

    所以,如果我对列表中的第三个值感兴趣,我将使用:

    SELECT 
      REGEXP_EXTRACT(string + '|',  r'(?U)^(?:.*\|){2}(.*)\|') AS substring,
      COUNT(1) AS weight
    FROM yourtable
    GROUP BY 1
    

    关于re2语法的更多细节here

相关问题