我写了一个sql查询来获取单词的频率。我创建了一个新列,用#分隔单词,然后计算它们的出现次数。但是,查询在完整数据集(大约14,000行)上运行需要数小时和数小时。所以我只用几个ID来运行它,并且当它应该只有大约20个左右时,我会把一些单词的数量计算为16,000+。
这是我的问题:
WITH mydata as
(
--query for test column
SELECT REGEXP_REPLACE(UPPER(TEST), ' ', '#') test
FROM (SELECT REGEXP_REPLACE (replace(description,'-','.'), '[' ||
REGEXP_REPLACE (replace(description,'-','.') || '!', '[^[:punct:]]') || ']') test
FROM my_table)
),
splitted_words as
(
SELECT REGEXP_SUBSTR(TEST,'[^#]+', 1, level) AS word
FROM mydata
CONNECT BY level <= LENGTH(regexp_replace(TEST,'[^#]')) + 1
AND PRIOR TEST = TEST
AND PRIOR sys_guid() IS NOT NULL
)
SELECT word,
COUNT(1)
FROM splitted_words
GROUP BY word;
我的专栏我循环看起来像这样:
TEST
---------------------------------------------
SPOKE#WITH#MR#SMITHS#ASSISTANT
EMAILED#FOR#VISIT
SCHEDULING#OFFICE#LM#FOR#VISIT
LM#FOR#VISIT
LM#FOR#VISIT
PHONE#CALL
---------------------------------------------
但我的结果看起来像这样:
word | count
-----|------
LM | 20
Visit| 24
Phone| 8161
With | 16
Email| 16080
当显然,#34; email&#34;
这个词没有16,000次出现任何想法为什么我会为某些词语获得疯狂的高数字? )因此导致查询需要12个多小时才能运行?)
答案 0 :(得分:2)
这是因为您检查了AND PRIOR TEST = TEST
。
在您的示例中,这将找到两行,而不仅仅是您当前使用的行:
LM#FOR#VISIT
LM#FOR#VISIT
如果你有一些id-column可以使用,或者你甚至可以检查PRIOR ROWID = ROWID
。