sql计数查询返回错误的数字

时间:2014-04-09 13:41:05

标签: sql count oracle11g

我写了一个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个多小时才能运行?)

1 个答案:

答案 0 :(得分:2)

这是因为您检查了AND PRIOR TEST = TEST

在您的示例中,这将找到两行,而不仅仅是您当前使用的行:

 LM#FOR#VISIT
 LM#FOR#VISIT

如果你有一些id-column可以使用,或者你甚至可以检查PRIOR ROWID = ROWID