【发布时间】:2019-06-13 16:25:26
【问题描述】:
假设我们有表学生(姓名、年级、组、年份) 我们想要一个查询,为每个组对应的学生排名。 我知道这可以通过 rank() OVER 轻松完成(按组顺序按等级 DESC 分区)。但我认为这也可以通过自联接或子查询来完成。有什么想法吗?
【问题讨论】:
-
使用
rank()效率更高。您为什么要以其他方式进行操作?
假设我们有表学生(姓名、年级、组、年份) 我们想要一个查询,为每个组对应的学生排名。 我知道这可以通过 rank() OVER 轻松完成(按组顺序按等级 DESC 分区)。但我认为这也可以通过自联接或子查询来完成。有什么想法吗?
【问题讨论】:
rank() 效率更高。您为什么要以其他方式进行操作?
等价于rank()的是:
select s.*,
(select 1 + count(*)
from students s2
where s2.group = s.group and
s2.grade > s.grade
) as rank
from students s;
【讨论】:
partition by 等价的是什么。
partition by group --> s2.group = s.group.