如何选择列中前5个最常用值

xvw2m8pv  于 2021-06-18  发布在  Mysql
关注(0)|答案(3)|浏览(314)

我想使用此数据库从数据库中选择最常用的前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名的标题计数值。似乎极限不需要计数,而是整数
预期结果:

|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        |

ps:这可能是sql的一个副本—连接表列中最常见的值,但我不能将其应用于我的

c9qzyr3d

c9qzyr3d1#

另一个答案很好,如果您使用的是SQLite3.25或更新版本(或者我认为是MySQL8),那么可以使用 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;
wwtsj6pe

wwtsj6pe2#

使用以下代码

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;
cbjzeqam

cbjzeqam3#

mysql和sqlite LIMIT 两个条款都缺少一个 WITH TIES 选项,这正是你需要的。所以改用子查询:选择五个最大数量的轨迹(这是一个罕见的实际合并的情况) GROUP BYDISTINCT - 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;

相关问题