查询没有分区依据或类似 rank() 的函数

Posted

技术标签:

【中文标题】查询没有分区依据或类似 rank() 的函数【英文标题】:Query without partition by or functions like rank() 【发布时间】:2019-06-13 16:25:26 【问题描述】:

假设我们有表学生(姓名、年级、组、年份) 我们想要一个查询,为每个组对应的学生排名。 我知道这可以通过 rank() OVER 轻松完成(按组顺序按等级 DESC 分区)。但我认为这也可以通过自联接或子查询来完成。有什么想法吗?

【问题讨论】:

使用rank() 效率更高。您为什么要以其他方式进行操作? 【参考方案1】:

等价于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 等价物更感兴趣。如果没有 OVER(partition by),我们如何实现 partition by? @valer 。 . . (1) 这回答了你的问题。 (2) 如果你看一下相关性子句,我认为很明显与partition by 等价的是什么。 只是为了确定,分区是否等同于从您的查询继续(从学生按组排序,等级 DESC)? @valer 。 . . partition by group --> s2.group = s.group.

以上是关于查询没有分区依据或类似 rank() 的函数的主要内容,如果未能解决你的问题,请参考以下文章

mysql查询排名

mysql查询排名

oracle 分组中排序(rank函数)

hive 中row_number(),rank,dense_ran()的用法

Postgres 窗口函数 - rank() 按 bigint 分区

Oracle排名函数(Rank)实例详解