使用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
但是然后对结果进行分组不起作用:
SELECT NTH(2,SPLIT('FIRST-SECOND','-')) as second_part FROM [FOO.bar] GROUP BY second_part limit 10
答案 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
的更多详细信息