BigQuery SPLIT()和按结果分组

时间:2015-05-15 00:17:12

标签: google-bigquery

使用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 个答案:

答案 0 :(得分:5)

我最好的猜测是你可以通过使用子查询获得相同的结果。类似的东西:

setSize

系统在内部汇总返回Nth我猜

答案 1 :(得分:4)

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

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

答案 2 :(得分: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将匹配到最后一个管道之前的所有内容。

答案 3 :(得分:0)

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

{
    "version": "0.1.0",

    // we want to run vs
    "command": "C:\\Program Files (x86)\\Microsoft Visual Studio 14.0\\Common7\\IDE\\devenv.exe",

    // the command is a shell script
    "isShellCommand": true,

    "showOutput": "silent",

     "args": ["/edit", "${file}"]

}

因此,如果我对列表中的第三个值感兴趣,我会使用:

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

有关re2语法here

的更多详细信息