Как сгруппировать одинаковые значения столбцов вместе с SQL? - PullRequest
1 голос
/ 21 апреля 2019

Прежде всего, я прошу прощения, если мой вопрос неясен, но действительно трудно выразить его одним коротким предложением. По сути, у меня есть таблица, которая выглядит так:

+-----------+-------------+
| BookName  | BookAuthor  |
+-----------+-------------+
| A         | Arthur      |
+-----------+-------------+
| A         | Will        |
+-----------+-------------+
| B         | Jack        |
+-----------+-------------+
| B         | Jack        |
+-----------+-------------+
| B         | Charles     |
+-----------+-------------+
| A         | Will        |
+-----------+-------------+
| A         | John        |
+-----------+-------------+

Я ищу SQL-запрос, в котором можно сгруппировать одинаковые значения BookName и BookAuthor для каждого имени книги, у которого у автора книги больше всего записей.

Так, следуя моему примеру, BookName "A" будет иметь "Will" в качестве автора книги, а BookName "B" будет иметь "Jack".

Я пробовал это: SELECT * FROM table GROUP BY BookName, BookAuthor HAVING BookName = "A", но результат, который я получу, - "Артур".

Любая помощь приветствуется; Большое спасибо.

Ответы [ 5 ]

1 голос
/ 21 апреля 2019

Вы можете группировать по имени и автору. В предложении HAVING сравните счетчик с другим агрегатом по имени и автору в подзапросе, получив счетчик, но на этот раз отфильтрованный по имени и ограниченный строкой (a) с максимальным счетом.

SELECT t1.bookname,
       t1.bookauthor
       FROM elbat t1
       GROUP BY t1.bookname,
                t1.bookauthor
       HAVING count(*) = (SELECT count(*)
                                 FROM elbat t2
                                 WHERE t2.bookname = t1.bookname
                                 GROUP BY t2.bookname,
                                          t2.bookauthor
                                 ORDER BY count(*) DESC
                                 LIMIT 1);

дб <> скрипка

Хотя это не разрывает связи. Но вы не упомянули, нужно ли вам это и как действуют правила в таком случае.

0 голосов
/ 21 апреля 2019

В статистике это называется режим .Один из относительно простых способов сделать это в MySQL - использовать два уровня агрегирования:

select bookname,
       substring_index(group_concat(bookauthor order by cnt desc), ',', 1) as mode_author
from (select bookname, bookauthor, count(*) as cnt
      from t
      group by bookname, bookauthor
     ) b
group by bookname;

В этом есть некоторые нюансы.Если авторы могут иметь запятые в своем имени, тогда необходим другой разделитель.Кроме того, если список авторов превышает максимальную длину по умолчанию для group_concat(), то это необходимо расширить.

MySQL 8+, конечно, упрощает это, поддерживая оконные функции:

select bookname, bookauthor 
from (select bookname, bookauthor, count(*) as cnt,
             row_number() over (partition by bookname order by count(*) desc) as seqnum
      from t
      group by bookname, bookauthor
     ) b
where seqnum = 1;

Вы не говорите, что делать в случае галстуков.Это возвращает одного произвольного лучшего автора.Но изменение row_number() на rank() возвращает их все.

0 голосов
/ 21 апреля 2019
with cte_books
as
(
  select bookname,bookauthor
  ,row_number() over(partition by bookname,bookauthor order by bookname,bookauthor) as [NumOfBooks]
  from elbat
)

select a.bookname,a.bookauthor,a.NumOfBooks
from cte_books a
inner join (
             select bookname, max([NumOfBooks]) as [NumOfBooks] from cte_books group by bookname
           ) as b
on a.bookname = b.bookname
and a.[NumOfBooks] = b.[NumOfBooks]
0 голосов
/ 21 апреля 2019

Если вам нужен номер записи, вы можете использовать count () и сгруппировать по

select BookName, count(*)
from my_table  
group by BookName
order by count(*)

, если вы хотите тот, у которого больше всего записей, вы можете использовать лимит 1

select BookName, count(*)
from my_table  
group by BookName
order by count(*)
limit 1

и для наиболее частого имени в каждой книге вы можете попробовать

select BookName, BookAuthor  ,  count(*)
from my_table  
group by BookNane, BookAuthor  
order by count(*)
0 голосов
/ 21 апреля 2019

Select count(BookAuthor) as 'NoOfAuthAsso' from table group by BookName

Это не даст вам ни одного из ассоциированных авторов для каждой книги

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...