Me gustaría contar las ocurrencias de todas las palabras en una columna. La parte difícil es que las palabras seguidas pueden aparecer en largos tramos; lo que significa que hay muchos espacios intermedios.

Este es un ejemplo ficticio:

column_name

aaa bbb ccc ddd
[aaa]
bbb
bbb

Hasta ahora logré usar el siguiente código

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

El código me da algo así

column_name         counts

aaa bbb ccc ddd     1
[aaa]               1
bbb                 2

Sin embargo, mi salida deseada es:

column_name         counts

aaa                 1
[aaa]               1
bbb                 3
ccc                 1
ddd                 1
0
Jo-Achna 11 abr. 2020 a las 14:10

2 respuestas

La mejor respuesta

En SQL Server, usaría 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;

La manipulación de cadenas depende en gran medida de la base de datos. La mayoría de las bases de datos tienen algún método para hacerlo, pero pueden ser bastante diferentes.

1
Gordon Linoff 11 abr. 2020 a las 12:00

Primero, eche un vistazo a esta pregunta para ver cómo dividir las palabras en tu columna en varias filas. En esa pregunta, las palabras están separadas por comas, pero, por supuesto, funciona igual con espacios.

Para su caso, suponiendo una tabla tablename con un id y sus palabras en columnname, donde tiene como máximo 4 palabras en la columna, se vería así:

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

Luego, simplemente puedes contar las palabras:

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

Si tiene más de 4 palabras en su columna, debe expandir la selección de numbers en consecuencia.

Editar: Oh, llego tarde, y asumí MySQL.

0
Dario Seidl 11 abr. 2020 a las 12:18