哪些播放列表具有最明显的流派,显示此类播放列表的ID,[Oracle]

aiazj4mn  于 2022-12-18  发布在  Oracle
关注(0)|答案(1)|浏览(129)

嗨,我想得到这个查询的结果。我试图得到这个查询的一些结果,但不理解这个查询问题语句的完整逻辑。这个查询返回我的播放列表ID与流派名称和曲目计数按流派名称分组。

这是我的sql代码:

select pt.playlistid,g.name,count(g.name) as genrecount from playlisttrack pt
join track t on pt.trackid=t.trackid
join genre g on t.genreid=g.genreid
group by pt.playlistid,g.name;

下面是数据库架构:

af7jpaap

af7jpaap1#

您希望找到每个播放列表的计数,因此希望GROUP BY该播放列表的主键(也不是按流派分组,因为你想统计不同的流派,而不是统计每种流派有多少)。然后找到流派的不同数量,可以使用COUNT(DISTINCT genreid)来计数流派的不同主键,并且由于标识符包括在track表中,因此不需要连接genre表。
在Oracle 12中,要获得最大值,可以使用ORDER BY thing_you_want_the_most_of DESC FETCH FIRST ROW WITH TIES

SELECT pt.playlistid,
       COUNT(DISTINCT t.genreid) AS genrecount
from   playlisttrack pt
       INNER JOIN track t
       ON (pt.trackid = t.trackid)
GROUP BY pt.playlistid
ORDER BY genrecount DESC
FETCH FIRST ROW WITH TIES;

或者,如果您只需要id:

SELECT pt.playlistid
from   playlisttrack pt
       INNER JOIN track t
       ON (pt.trackid = t.trackid)
GROUP BY pt.playlistid
ORDER BY COUNT(DISTINCT t.genreid) DESC
FETCH FIRST ROW WITH TIES;

或者,使用解析函数RANK而不是FETCH语法:

SELECT playlistid
FROM   (
  SELECT pt.playlistid,
         RANK() OVER (ORDER BY COUNT(DISTINCT t.genreid) DESC) AS rnk
  from   playlisttrack pt
         INNER JOIN track t
         ON (pt.trackid = t.trackid)
  GROUP BY pt.playlistid
)
WHERE  rnk = 1;

相关问题