表格中有一列最多可存储4000个字符。因此,对于给定的行,我们需要编写一个查询来显示句子中相应的每个不同单词的计数。
例如这个专栏已经"杰克和吉尔上了山。杰克跌倒了#34;
Output :
<Word> - <Count>
Jack - 2
Jill - 1
hill - 1
and - 1
a - 1
came - 1 ... and so on
答案 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;