首页 > 解决方案 > 在 Oracle SQL 中计算列中的单词数

问题描述

您如何根据模式对这些数据进行分组?在 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 个品牌名称可以是第一个词、第二个词、第三个词或最后一个词。

解决此问题的一种可能方法是获取子字符串并对其进行计数,然后按 count(pattern) desc 排序,其中 rownum < 4800;

现在我需要找到单词的数量(例如:Apple、Samsung、Motorola)

所需的输出如下所示:

在此处输入图像描述

标签: sqldatabaseoraclegroup-bycount

解决方案


如果模式可以简化为名称的第一个单词,则如下所示:

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

推荐阅读