Как посчитать каждого символа с поля varchar? - PullRequest
0 голосов
/ 16 ноября 2018

Необходимо получить символ и количество символов. Персонаж с наибольшим количеством символов будет сообщен первым. Как посчитать каждого символа с поля varchar?

CREATE TABLE name(
    id SERIAL PRIMARY KEY,
    value TEXT
);
INSERT INTO name (value) VALUES ('abcd');
INSERT INTO name (value) VALUES ('abcd efg');
INSERT INTO name (value) VALUES ('m');

Ожидается мой выход

a 2
b 2
c 2
d 2
e 1
f 1
g 1
m 1

Я написал запрос, который получил только одну букву

SELECT 
 sum( 
    ROUND (   
        (
            LENGTH(value)
            - LENGTH( REPLACE ( value, 'a', '') ) 
        ) / LENGTH('a')        
    )) AS a    
FROM name

Ответы [ 2 ]

0 голосов
/ 16 ноября 2018

Вы можете создать список всех символов, используя string_to_array() и unnest, а затем сгруппировать этот результат:

select t.c, count(*)
from name, unnest(string_to_array(value,null)) as t(c)
where t.c <> ' '
group by t.c
order by count(*) desc

Онлайн пример: https://rextester.com/JXYR32728

0 голосов
/ 16 ноября 2018

Я бы пошел с подходом календарной таблицы здесь:

SELECT
    t1.letter,
    COUNT(t2.name) AS cnt
FROM
(
    SELECT 'a' AS letter UNION ALL
    SELECT 'b' UNION ALL
    SELECT 'c' UNION ALL
    ...
    SELECT 'z'
) t1
LEFT JOIN names t2
    ON t2.name LIKE '%' || t1.letter || '%'
GROUP BY
    t1.letter
ORDER BY
    t1.letter;

Демо

Обратите внимание, что это сообщает обо всех буквах в алфавите, даже если они имеют нулевой счет.Если вы хотите видеть только положительные значения, добавьте в конец запроса следующее:

HAVING COUNT(t2.name) > 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...