MySQL中带有Order By子句的Rank函数

Posted

技术标签:

【中文标题】MySQL中带有Order By子句的Rank函数【英文标题】:Rank function in MySQL with Order By clause 【发布时间】:2012-06-08 13:35:57 【问题描述】:

这个(Oracle)SQL怎么会:

select a.*, rank() over (partition by a.field1 order by a.field2 desc) field_rank
from table_a a
order by a.field1, a.field2

被翻译成mysql

This question 似乎相似,但在基本查询的末尾没有 Order By。还有,按分区的字段排序有关系吗?

【问题讨论】:

我不知道 qracle 所以你能先显示你想要的结果和样本数据 我可以给出一个简单的解释,就像你有 A 列和 B 列,你按 A 然后 B 排序,然后为 A 中的每个组成员给出一个基于 B 的排名。如果我是对的。 【参考方案1】:

根据您提供的链接,它应该如下所示:

SELECT    a.*,
( 
            CASE a.field1 
            WHEN @curType 
            THEN @curRow := @curRow + 1 
            ELSE @curRow := 1 AND @curType := a.field1 END
          ) + 1 AS rank
FROM      table_a a,
          (SELECT @curRow := 0, @curType := '') r
ORDER BY  a.field1, a.field2 desc;

根据您提供的链接中的示例,这里有 2 个小提琴,一个用于 oracle,一个用于 mySql:

    oracle Mysql

【讨论】:

按部分分区的好方法。但我想知道 MySQL 是否会在 21 世纪赶上现代 SQL 功能。 +1 不错!谢谢,它有效!我唯一改变的是我没有在表达式后面写“+ 1”(它从2开始)。

以上是关于MySQL中带有Order By子句的Rank函数的主要内容,如果未能解决你的问题,请参考以下文章

rank() over(partition by A order by B) MySQL里可以partition多个字段嘛

MySQL的order by子句

Oracle Order by - 基于函数 (dense_rank)

MySQL 5.6 - DENSE_RANK 类似没有 Order By 的功能

SQL Server 数据库中带有 Group by 子句的 JPQL 不起作用

4. MySQL必知必会之排序检索数据-ORDER BY