2015-05-15 52 views
3

使用SPLIT() & NTH(),我分割一个字符串值,并将第二个子字符串作为结果。然后我想对这个结果进行分组。然而,当我在结合使用SPLIT()与GROUP BY,它一直给错误:BigQuery SPLIT()和按结果分组

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

回答

5

我最好的猜测是你可以得到一个equiv通过使用子查询alent结果。喜欢的东西:

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

系统返回第N在聚合内部我想

+0

工程。但它确实不应该是必要的。 –

4

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

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

我喜欢David的回答 - 有时使用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引擎语法中的“un-greedy”匹配标志。没有这个标志,如果有多个由管道分隔的值,这个RegEx将匹配所有东西直到最后一个管道。

+0

小修正 - 提取第二个值(因为它有问题)应该是REGEXP_EXTRACT(splitme,r'(?U)^。* \ |(。*)\ |')' –

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