【问题标题】:SQL plus, top 3 rank across two tablesSQL plus,两个表排名前 3
【发布时间】:2016-03-03 11:50:29
【问题描述】:

我正在尝试找到一种方法来查询数据库中前三位用户的收听次数,并输出他们的用户 ID 和排名。

这两个表的架构如下:

User(user_id, email, first_name, last_name, password, created_on, last_sign_in)

PreviouslyPlayed(user_id, track_id, timestamp)

我可以看到有多少人通过计数查询来实现这一目标,但我想知道有没有办法通过排名或密集排名来做到这一点

【问题讨论】:

  • 不要命名您的表用户。它是 Oracle 中的保留字。

标签: sql oracle rank dense-rank


【解决方案1】:

如果您只需要用户 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() 以确保您得到了您真正想要的(不同之处在于它们处理关系的方式)。

如果您担心某个表中名为 user_id 的内容不是有效的用户 ID,则您只需要 join。在任何设计良好的数据库中,这似乎都不太可能。

【讨论】:

    猜你喜欢
    • 2014-09-03
    • 2014-06-18
    • 2014-05-09
    • 1970-01-01
    • 2020-03-15
    • 1970-01-01
    • 2010-10-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多