计算分隔字段中子字符串的出现

时间:2019-01-09 17:38:28

标签: sql google-bigquery

我有一些看起来像这样的数据

Sequence, length
abc, 1
bat, 1
abc > abc, 2
abc > bat, 2
ced > ced > ced > fan, 4

我正在尝试将各种字符串的频率作为此数据的新列。例如:

Sequence, length, count_of_ced
abc, 1, 0
bat, 1, 0
abc > abc, 2, 0
abc > bat, 2, 0
ced > ced > ced > fan, 4, 3

我正在尝试通过获取长度值并减去Sequence字段的长度来解决此问题,将“ ced”字符串替换为“”,如下所示:

length - array_length(split(replace(Sequence, "ced", ""), " > " )) as count_of_ced

但是此行的所有结果都为0。

这是正确的方法吗?我已经用“>”和“>”上的字符串分割对它们进行了测试,但是我仍然得到0。我已经翻阅了Google Bigquery文档,但没有找到预建的substring_count()函数或其他任何东西。

2 个答案:

答案 0 :(得分:4)

有一种经过尝试的真实字符串长度方法:

select (length(replace(sequence, 'ced', 'ced+')) - length(sequence)) as num_ced

或者,您可以使用数组:

select array_length(regexp_extract_all(sequence, 'ced'))

答案 1 :(得分:0)

以下版本使用'ced'作为分隔符

SELECT ARRAY_LENGTH(SPLIT(Sequence, 'ced')) - 1   

您可以使用问题中的伪数据对其进行测试,如下所示

#standardSQL
WITH `project.dataset.table` AS (
  SELECT 'abc' Sequence, 1 length UNION ALL
  SELECT 'bat', 1 UNION ALL
  SELECT 'abc > abc', 2 UNION ALL
  SELECT 'abc > bat', 2 UNION ALL
  SELECT 'ced > ced > ced > fan', 4 
)
SELECT Sequence, length, 
  ARRAY_LENGTH(SPLIT(Sequence, 'ced')) - 1 AS count_of_ced
FROM `project.dataset.table`  

结果为

Row Sequence                length  count_of_ced     
1   abc                     1       0    
2   bat                     1       0    
3   abc > abc               2       0    
4   abc > bat               2       0    
5   ced > ced > ced > fan   4       3