我试图找到一种方法来查询数据库中前三个用户的收听次数,并输出他们的用户 ID 和排名。
有问题的两个表的架构如下:
User(user_id, email, first_name, last_name, password, created_on, last_sign_in)
PreviouslyPlayed(user_id, track_id, timestamp)
我可以看到有多少人通过计数查询来解决这个问题,但我想知道有没有办法通过排名或密集排名来做到这一点
我试图找到一种方法来查询数据库中前三个用户的收听次数,并输出他们的用户 ID 和排名。
有问题的两个表的架构如下:
User(user_id, email, first_name, last_name, password, created_on, last_sign_in)
PreviouslyPlayed(user_id, track_id, timestamp)
我可以看到有多少人通过计数查询来解决这个问题,但我想知道有没有办法通过排名或密集排名来做到这一点
如果您只需要用户 ID 并且正在使用 Oracle 12g+,那么您可以执行以下操作:
select pp.user_id, rank() over (order by count(*) desc) as therank
from previouslyplayed pp
group by pp.user_id
order by count(*) desc
fetch first 3 rows only;
在早期版本中,您将使用子查询:
select pp.*
from (select pp.user_id, rank() over (order by count(*) desc) as therank
from previouslyplayed pp
group by pp.user_id
) pp
where therank <= 3;
您可能想查看row_number()
, rank()
, 并dense_rank()
确保您得到了您真正想要的东西(不同之处在于它们处理关系的方式)。
join
如果您担心user_id
在一个表中调用的内容不是有效的用户 ID ,您只需要。在任何设计良好的数据库中,这似乎不太可能。