Какой SQL запрос выведет самые часто встречающиеся записи?

Здравствуйте. Есть тестовая БД библиотеки, которую я сам создал. Есть две таблицы: BOOKS и POSSESSION. Первая хранит информации о книгах(наименование, автор, год издания, издательство и количество книг в библиотеке). Во второй информации о том, кто, какую книзу когда взял и сдал. Модель данных на рисунке:
61a0caf44828a006234333.png
Мне нужно узнать самого популярного автора за год. Собственно вот какой запрос я сделал:
SELECT AUTHOR
FROM POSSESSION
INNER JOIN BOOKS ON BOOK_ID = BOOKS.ID
WHERE TAKING_DATE > (CURRENT_DATE - INTERVAL '1 year')
GROUP BY AUTHOR
ORDER BY COUNT(AUTHOR) DESC
LIMIT 1;

Однако я сам понимаю, что если таких авторов будет два, то запрос не вернет правильное значение. Напрашивается вывод, что нужен какой-то подзапрос с агрегатной функцией MAX, но из-за того, что давно не работал с SQL не понимаю как и куда его вставить. Можете подсказать?
  • Вопрос задан
  • 150 просмотров
Решения вопроса 2
@nozzy
Silex, Symfony, Laravel, SQL
select 
t1.AUTHOR,
t1.total
from
(
SELECT AUTHOR, count(*) as total
FROM POSSESSION
INNER JOIN BOOKS ON BOOK_ID = BOOKS.ID
WHERE TAKING_DATE > (CURRENT_DATE - INTERVAL '1 year')
GROUP BY AUTHOR
)  t1
where t1.total =
(
select
max(t2.total)
from
(
SELECT AUTHOR, count(*) as total
FROM POSSESSION
INNER JOIN BOOKS ON BOOK_ID = BOOKS.ID
WHERE TAKING_DATE > (CURRENT_DATE - INTERVAL '1 year')
GROUP BY AUTHOR
) t2
)
Ответ написан
rozhnev
@rozhnev
Fullstack programmer, DBA, медленно, дорого
Начиная с PostgreSQL 13 можно использовать новый функционал FETCH вместо LIMIT :
SELECT AUTHOR
FROM POSSESSION
INNER JOIN BOOKS ON BOOK_ID = BOOKS.ID
WHERE TAKING_DATE > (CURRENT_DATE - INTERVAL '1 year')
GROUP BY AUTHOR
ORDER BY COUNT(AUTHOR) DESC
FETCH FIRST 1 ROWS WITH TIES;


PostgreSQL fetch online
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы