Подсчет количества слов в столбце в Oracle SQL - PullRequest
0 голосов
/ 24 апреля 2019

Как вы группируете эти данные на основе паттернов?Это возможно в SQL?

 CREATE TABLE ABC ("NAMES" VARCHAR2(50 BYTE)) `

`INSERT INTO ABC (names) VALUES ('CA Apple 3');
 INSERT INTO ABC (names) VALUES ('New Apple 4');
 INSERT INTO ABC (names) VALUES ('Cra Apple 5');
 INSERT INTO ABC (names) VALUES ('UK Apple 5c');
 INSERT INTO ABC (names) VALUES ('Apple 6s');
 INSERT INTO ABC (names) VALUES ('Apple 7');
 INSERT INTO ABC (names) VALUES ('Apple x');
 INSERT INTO ABC (names) VALUES ('az Apple xr');
 INSERT INTO ABC (names) VALUES ('Apple xs');
 INSERT INTO ABC (names) VALUES ('Motorola RIZR');
 INSERT INTO ABC (names) VALUES ('eu Motorola RAZR');
 INSERT INTO ABC (names) VALUES ('Motorola RoZR');
 INSERT INTO ABC (names) VALUES ('Motorola RR');
 INSERT INTO ABC (names) VALUES ('fin Motorola RIZ');
 INSERT INTO ABC (names) VALUES ('Motorola R');
 INSERT INTO ABC (names) VALUES ('sau Google Pixel');
 INSERT INTO ABC (names) VALUES ('Google Pixel 2');
 INSERT INTO ABC (names) VALUES ('Google Pixel 3');
 INSERT INTO ABC (names) VALUES ('Samsung Galaxy');
 INSERT INTO ABC (names) VALUES ('aus Samsung Galaxy 3');
 INSERT INTO ABC (names) VALUES ('Samsung Small 2');
 INSERT INTO ABC (names) VALUES ('Samsung Earth');
 INSERT INTO ABC (names) VALUES ('ko Samsung Solar');
 INSERT INTO ABC (names) VALUES ('Samsung Milky Way');
 INSERT INTO ABC (names) VALUES ('Samsung Chill');
 INSERT INTO ABC (names) VALUES ('Yi Apple Chill');
 INSERT INTO ABC (names) VALUES ('In Apple');
 INSERT INTO ABC (names) VALUES ('razy Motorola');
 INSERT INTO ABC (names) VALUES ('Samsung');`

Итак, у меня есть такая таблица, представьте, что есть 500000 строк и 4800 торговых марок.

4800 названий брендов могут быть либо первым словом, вторым словом, третьим словом или последним словом.

Один из возможных способов решения этой проблемы - получить подстроки и сосчитать их, а также Упорядочить по количеству (шаблону) desc, где rownum <4800; </p>

Теперь мне нужночтобы найти количество слов (например, Apple, Samsung, Motorola)

Желаемый вывод показан ниже:

enter image description here

Ответы [ 4 ]

1 голос
/ 24 апреля 2019

Ну, если у вас есть ключевые слова, которые вы хотите найти, вы можете сделать join следующим образом:

select p.pat, count(*) 
from abc join
     (select 'Motorola' as pat from dual union all
      select 'Samsung' from dual union all
      select 'Apple' from dual union all
      . . .
     ) p
     on abc.name like '%' || p.pat || '%'
group by p.pat
order by count(*) desc;

Обратите внимание, что это будет считать одну строку более одного раза, если она соответствует более чем одному шаблону.

1 голос
/ 24 апреля 2019

В SQL-Server, начиная с версии 2008, вы можете создать полнотекстовый индекс для нужного столбца. Это предполагает, что у вас есть столбец индекса в вашей таблице. Пример:

CREATE UNIQUE INDEX uix_abc_id ON ABC(id);
CREATE FULLTEXT CATALOG ft AS DEFAULT;  
CREATE FULLTEXT INDEX ON ABC(names)   
   KEY INDEX uix_abc_id   
   WITH STOPLIST = SYSTEM;

Это позволит вам эффективно запрашивать количество вхождений для слов, используя хранимую процедуру sys.dm_fts_index_keywords.

example

Как правило, общие ключевые слова объявляются как стоп-слова, и вы можете добавить свои собственные стоп-слова , которые не будут проиндексированы и не появятся в упомянутом хранимом процессе.

1 голос
/ 24 апреля 2019

Если шаблон можно упростить до 1-го слова в имени, то примерно так:

select
  case 
    when names like '%_ %' then substring(names, 1, charindex(' ', names) - 1) 
    else names
  end pattern,
  count(*) counter
from abc
group by case 
    when names like '%_ %' then substring(names, 1, charindex(' ', names) - 1) 
    else names
  end

, который будет работать для SqlServer.
См. демо .
Результаты:

> pattern  | counter
> :------- | ------:
> Apple    |       9
> Google   |       3
> In       |       1
> Motorola |       6
> razy     |       1
> Samsung  |       8
> Yi       |       1
0 голосов
/ 24 апреля 2019

Ответ на этот набор данных приведен ниже:

`select * from(
 select x,count(*) as coun from ( 
 select substr(names,
            INSTR(names, ' ', -1, 1)+1) as x
            from abc


  union all

  SELECT SUBSTR(names,
          INSTR(names, ' ', 1, 1) + 1,
          INSTR(names, ' ', 1, 2) - INSTR(names, ' ', 1, 1) - 1) as x
  FROM abc

  union all 

   SELECT SUBSTR(names,1,
          INSTR(names, ' ',1 , 1)-1) as x
   FROM abc
   )
   where x is not null and x not in ('1','2','3','4','5','6','7')
  group by x
  order by coun desc)
  where rownum < 4800;'

Ответ:

enter image description here

...