跪地求解 如何用MySQL 实现Oracle里的 rank()over(ORDER BY) 功能?
小弟在google baidu 搜索很久后依然无果,无奈只好来je求教各位高人指导。。。
例如我有一张表 表名为 A:
ID SCORE
1 28
2 33
3 33
4 89
5 99
6 68
7 68
8 78
9 88
10 90
现在我需要如下结果:
ID SCORE RANK
5 99 1
10 90 2
4 89 3
9 88 4
8 78 5
6 68 6
7 68 7
2 33 8
3 33 9
1 28 10
用sql语句在mysql下实现如上功能,恳请各位大大费神帮忙!
感激不尽!!!
rownum这个变量可以不要
[code="sql"]SELECT id,
score,
rank
FROM (SELECT tmp.id,
tmp.score,
@rank := @rank + 1 AS rank
FROM (SELECT id,
score
FROM a
ORDER BY score desc) tmp,
(SELECT @rank := 0) a) RESULT;[/code]
如果要实现oracle中,rank() over(partition by [id] order by [col])需要更多变量了,你可以试着写出满足自己需求的函数
mysql没有这个函数,可以使用变量实现,针对你的需求,写了一个
[code="sql"]SELECT id,
score,
rank
FROM (SELECT tmp.id,
tmp.score,
@rownum := @rownum + 1,
@rank := @rank + 1 AS rank
FROM (SELECT id,
score
FROM a
ORDER BY score desc) tmp,
(SELECT @rownum := 0,
@rank := 0) a) RESULT;[/code]