Подсчитайте частоты слов, разделенных несколькими пробелами - PullRequest
0 голосов
/ 11 апреля 2020

Я бы хотел посчитать вхождения всех слов в столбце. Сложность в том, что слова подряд могут появляться в длинных отрезках; Это означает, что между ними много пробелов.

Это фиктивный пример:

column_name

aaa bbb ccc ddd
[aaa]
bbb
bbb

Пока мне удалось использовать следующий код

SELECT column_name, 
    SUM(LEN(column_name) - LEN(REPLACE(column_name, ' ', ''))+1) as counts
FROM 
    dbo.my_own
GROUP BY 
    column_name

Код дает мне что-то вроде этого

column_name         counts

aaa bbb ccc ddd     1
[aaa]               1
bbb                 2

Тем не менее, мой желаемый вывод:

column_name         counts

aaa                 1
[aaa]               1
bbb                 3
ccc                 1
ddd                 1

Ответы [ 2 ]

1 голос
/ 11 апреля 2020

На SQL сервере вы должны использовать string_split():

select s.value as word, count(*)
from dbo.my_own o cross apply
     string_split(o.column_name, ' ') s
where s.value <> ''
group by s.value;

Работа со строками сильно зависит от базы данных. В большинстве баз данных есть какой-то метод для этого, но они могут быть совершенно разными.

0 голосов
/ 11 апреля 2020

Сначала взгляните на этот вопрос , чтобы узнать, как разбить слова в столбце на несколько строк. В этом вопросе слова разделены запятой, но, конечно, это работает так же с пробелами.

Для вашего случая, предположим, что таблица tablename с id и ваши слова в columnname где у вас есть максимум 4 слова в столбце, это будет выглядеть так:

SELECT
    tablename.id,
    SUBSTRING_INDEX(SUBSTRING_INDEX(tablename.columnname, ' ', numbers.n), ' ', -1) columnname
FROM
    (SELECT 1 AS n UNION ALL
     SELECT 2 UNION ALL
     SELECT 3 UNION ALL
     SELECT 4) numbers
     INNER JOIN tablename
     ON LENGTH(tablename.columnname) - LENGTH(REPLACE(tablename.columnname, ' ', '')) >= numbers.n - 1
ORDER BY
    id, n

Тогда вы можете просто посчитать слова:

SELECT columnname, count(*) FROM (
    SELECT
        tablename.id,
        SUBSTRING_INDEX(SUBSTRING_INDEX(tablename.columnname, ' ', numbers.n), ' ', -1) columnname
    FROM
        (SELECT 1 AS n UNION ALL
         SELECT 2 UNION ALL
         SELECT 3 UNION ALL
         SELECT 4) numbers
         INNER JOIN tablename
         ON LENGTH(tablename.columnname) - LENGTH(REPLACE(tablename.columnname, ' ', '')) >= numbers.n - 1
    ORDER BY
        id, n
) normalized
GROUP BY columnname

Если у вас больше, чем 4 слова в вашем столбце, вам нужно расширить выбор с numbers соответственно.

Редактировать: О, я опоздал, и я предположил MySQL.

...