查询以显示相应的每个不同单词的计数

时间:2015-09-13 11:06:37

标签: sql oracle teradata

表格中有一列最多可存储4000个字符。因此,对于给定的行,我们需要编写一个查询来显示句子中相应的每个不同单词的计数。

例如这个专栏已经"杰克和吉尔上了山。杰克跌倒了#34;

Output :  
<Word> - <Count> 
Jack - 2 
Jill - 1
hill - 1
and - 1
a - 1
came - 1 ... and so on

2 个答案:

答案 0 :(得分:1)

由于您标记了Teradata,因此可以使用STRTOK_SPLIT_TO_TABLE作为标记部分。只需在分隔符列表中添加更多字符:

with cte as
(select
    1 as keycol,
    'Jack and Jill went up a hill. Jack came tumbling down' as col)
select keycol, token, count(*) as cnt
FROM TABLE (STRTOK_SPLIT_TO_TABLE(cte.keycol, cte.col, 
            ' .,;:-?!()''"') -- list of separators
     RETURNS (keycol INTEGER,
              tokennum INTEGER,
              token VARCHAR(100) CHARACTER SET UNICODE)
           ) AS d 
group by 1,2
order by 1, cnt desc

但是计算单词可能要复杂得多,因为它通常包括标记化,词干化和停止单词。

答案 1 :(得分:0)

首先,将单词转换为行,然后将其分组。

在此查询中,我们使用CONNECT BY生成行的基本概念。

例如:

select level from dual CONNECT BY level <= 10;

上述查询将生成10行。(层次级别查询)。

基于这个简单的逻辑,现在我们必须在这里计算空格的数量,并生成那么多行。REGEXP_COUNT(str,'[^ ]+')将给出句子中的空格数。

使用关卡,从每行的句子中提取一个单词。 REGEXP_SUBSTR(str,'[^ ]+',1,level)会这样做。

您可以使用此查询来处理其他方案。祝你好运。

with tokenised_rows(str) as(
SELECT  REGEXP_SUBSTR('Jack and Jill went up a hill. Jack came tumbling down','[^ ]+',1,LEVEL) 
  FROM dual
CONNECT BY level <= REGEXP_COUNT('Jack and Jill went up a hill. Jack came tumbling down','[^ ]+')
)
select str,count(1) from tokenised_rows
group by str;