Найти количество первых символов `Name` по всем значениям и затем отсортировать их (PostgreSQL) - PullRequest
0 голосов
/ 14 ноября 2018

У меня есть таблица со следующими строками:

key Name
 1   Mighty
 2   Jon
 3   Jaine
 4   Arya

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

A 3
J 2
M 1

A существует 3 раза, один раз в Jaine и дважды в Arya.

Ответы [ 4 ]

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

Сначала необходимо создать список всех символов в таблице, затем список всех первых символов и затем объединить их обоих:

with all_chars as (
   select c
   from names, unnest(string_to_array(lower(name), null)) as t(c)
), first_chars as (
   select distinct lower(left(name,1)) as c
   from names
)
select fc.c, 
       (select count(*) from all_chars ac where ac.c = fc.c) as cnt
from first_chars fc
order by cnt desc, fc.c;

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

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

Попробуйте этот параметр:

SELECT LEFT(Name, 1) AS letter, COUNT(*) AS cnt
FROM your_table
GROUP BY LEFT(Name, 1)
ORDER BY COUNT(*) DESC, letter;

Демо

Обратите внимание, что предложение ORDER BY сначала сортируется по убыванию, затемсортировка по первой букве, если две или более буквы связаны с одинаковым количеством.

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

Этот код дает ожидаемый результат.Протестировано в SQL Fiddle .Предполагается, что данные хранятся в таблице table1:

with first_letters as
(
    select
    upper(left(Name,1)) as letter_uppercase,
    count(*) as count_ignore
    from table1
    group by upper(left(Name,1))
),
occurrences as (
    select 
    t1.Name,
    length(t1.Name) - length(replace(upper(t1.Name), fl.letter_uppercase,'')) as occurrence
    from table1 t1
    inner join first_letters fl on fl.letter_uppercase = upper(left(t1.Name,1))
)
select
result.letter_uppercase,
sum(result.occurrence) as sum_occurrence
from
(
    select
    fl.letter_uppercase,
    o.occurrence
    from first_letters fl
    inner join occurrences o on upper(o.Name) like '%' || fl.letter_uppercase || '%' 
) result
 group by result.letter_uppercase
 order by sum(result.occurrence) desc,
          result.letter_uppercase;
0 голосов
/ 14 ноября 2018

Попробуйте вот так

SELECT LEFT(Name,1) AS letter, COUNT(*) As ct
FROM Tbl
GROUP BY LEFT(Name,1) 
ORDER BY ct DESC,letter
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...