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多个字段嘛
Oracle Order by - 基于函数 (dense_rank)
MySQL 5.6 - DENSE_RANK 类似没有 Order By 的功能