【问题标题】:Is there a way to determine which string shows up the most within a certain row?有没有办法确定在某一行中哪个字符串显示最多?
【发布时间】:2019-11-04 18:13:08
【问题描述】:

我正在建立一个数据库,这个数据库有几个评论。我想选择一条评论,并且我想确定该评论中出现次数最多的单词。例如,假设评论是“糟糕的食物,糟糕的服务,糟糕的地方”。我想返回可怕这个词。我在 Oracle 11g Express 上运行。

我实际上完全被这件事难住了。如果行只包含一个字符串,我会知道该怎么做,但是由于行包含多个字符串(完整的段落),这对我来说是个问题。我使用的是 PL/SQl,所以我不仅限于 SQL 语句。

这是我的评论表

CREATE TABLE REVIEW (
review_id INT,
review_text CLOB,
primary key (review_id));

正如我所说,我对此感到很困惑。我找不到太多关于如何对一大行文本进行排序的信息,然后找到文本中出现的最常见的字符串。

【问题讨论】:

标签: sql oracle plsql oracle11g


【解决方案1】:

有一些事情需要处理,比如“糟糕的食物,糟糕的服务,糟糕的地方”。应该把“可怕”和“可怕”算在一起,还要去掉标点符号。这些可以通过正则表达式处理。此外,如果几个单词的计数相同,则应分别显示。下面的回答是肯定的。

with review as
      -- CTE (Oracle: Subquery Factoring) for test data. TO BE Replaced by actual table.
     (select 'Terrible food, terrible service, bad, bad place' || chr(13) || chr(10) || 'Just stay away!!' review_text from dual)
   , review_words as
     -- Strip target string of Punctuation and Control characters, also reduce multiple spaces to single space
     (select regexp_replace(regexp_replace(review_text,'[[:punct:][:cntrl:]]',' '),'\s{2,}',' ') rwords
        from review
     )
   , word_list as 
     -- Now from result of above the individual words and convert to lower case.
     ( select lower(regexp_substr(rwords,'[^ ]+',1,rownum)) words 
         from review_words connect by level <=  regexp_count(rwords,' ') 
     )
-- get each word and count highest ranked words.
select word, cnt 
  from ( -- Rank the Word count  
         select word, cnt, rank() over(order by cnt desc) rnk
           from (-- get the number of occurrence of eah word.
                 select words word, count(*) cnt 
                   from word_list   
                  group by words
                )
       )
 where rnk = 1;

在此处查看fiddle

【讨论】:

    【解决方案2】:

    也许这样的事情会有所帮助...... 我找到了这个ARTICLE

    我对它进行了一些重新配置,以便它在 clob 列中找到最常见的电子邮件。这是查询:

    with emails as (
      select 
        cast(trim(
          regexp_substr(t.toaddress, '[^,]+', 1, levels.column_value)
        ) as varchar2(320)) as email,
        domain,
        id
      from  t,
            table(cast(multiset(
              select level from dual 
              connect by level <= length (regexp_replace(t.toaddress, '[^,]+')) + 1
            ) as sys.OdciNumberList)) levels
    )
      select email from (select email, count(email) ce
      from   emails
      group by email) where ce = (select max(ce) 
                                  from (select email, count(email) ce
                                        from   emails
                                        group by email));
    

    这里是DEMO 但是所有的荣耀都归于 康纳·麦克唐纳

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-18
      • 1970-01-01
      • 1970-01-01
      • 2019-01-14
      • 2013-09-22
      • 1970-01-01
      • 1970-01-01
      • 2022-08-11
      相关资源
      最近更新 更多