Как выбрать 5 наиболее часто встречающихся значений в столбце - PullRequest
0 голосов
/ 25 октября 2018

Я хочу выбрать 5 самых популярных альбомов из базы данных, используя эту базу данных: http://www.sqlitetutorial.net/tryit/query/sqlite-inner-join/#3

с этим запросом:

SELECT
  albums.title AS Album,
  artists.name AS Artist,
  COUNT(albums.title ) as TitleCount
FROM tracks
INNER JOIN albums ON albums.albumid = tracks.albumid
INNER JOIN artists ON artists.artistid = albums.artistid
GROUP BY 
  albums.albumid 
ORDER BY 
  TitleCount DESC

Предел 5 не является хорошим решением, как и в моем случае, есть 2 альбома с 25 названиями, что я хочу, чтобы топ-5 по значению titleCount.Кажется, что предел не принимает COUNT, но целые числа

ожидаемый результат:

|Album               |Artist       |TitleCount|
|Greatest Hits       |Lenny Kravitz|57        |  
|Minha Historia      |Chico Buarque|34        |
|Unplugged           |Eric Clapton |30        |
|Lost, Season 3      |Lost         |26        |
|Lost, Season 1      |Lost         |25        |
|The Office, Season 3|The Office   |25        |

пс: это может быть дубликат SQL - наиболее частое значение в столбце соединениятаблицы , но я не могу применить его к моим

Ответы [ 3 ]

0 голосов
/ 25 октября 2018

Используйте ниже код

    SELECT
  albums.title AS Album,
  artists.name AS Artist,
  COUNT(*) as TitleCount
FROM tracks
INNER JOIN albums ON albums.albumid = tracks.albumid
INNER JOIN artists ON artists.artistid = albums.artistid
GROUP BY albums.albumid 
HAVING COUNT(*) IN
(
  SELECT DISTINCT COUNT(*)
  FROM tracks
  GROUP BY albumid
  ORDER BY count(*) DESC

)
ORDER BY TitleCount DESC LIMIT 5;
0 голосов
/ 25 октября 2018

Хотя другой ответ работает нормально, если вы используете sqlite 3.25 или новее (или я думаю, что MySQL 8), это можно сделать более простым способом, используя оконную функцию dense_rank() :

WITH rankings(Album, Artist, TitleCount, ranking) AS (
  SELECT al.title, ar.name, count(al.title)
       , dense_rank() OVER (ORDER BY count(al.title) DESC)
  FROM tracks AS t
  INNER JOIN albums AS al ON al.albumid = t.albumid
  INNER JOIN artists AS ar ON ar.artistid = al.artistid
  GROUP BY al.albumid)
SELECT Album, Artist, TitleCount
FROM rankings
WHERE ranking <= 5
ORDER BY ranking;
0 голосов
/ 25 октября 2018

В предложениях MySQL и SQLite LIMIT отсутствует опция WITH TIES, которая вам здесь нужна.Так что используйте вместо этого подзапрос: выберите пять наибольших количеств треков (что является редким случаем, когда вы фактически комбинируете GROUP BY с DISTINCT - GROUP BY, чтобы получить счет за альбом, DISTINCT, чтобы получить пять высших Разное рассчитывает), затем выберите альбомы, содержащие как можно больше треков.Поскольку речь идет о результате агрегирования, он относится к предложению HAVING:

SELECT
  albums.title AS Album,
  artists.name AS Artist,
  COUNT(*) as TitleCount
FROM tracks
INNER JOIN albums ON albums.albumid = tracks.albumid
INNER JOIN artists ON artists.artistid = albums.artistid
GROUP BY albums.albumid 
HAVING COUNT(*) IN
(
  SELECT DISTINCT COUNT(*)
  FROM tracks
  GROUP BY albumid
  ORDER BY count(*) DESC
  LIMIT 5
)
ORDER BY TitleCount DESC;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...