Voici une approche différente qui ne nécessite pas de jointure. Dans mon cas (une table avec plus de 15 000) lignes, elle s'exécute en 3 secondes environ. (La méthode JOIN prend un ordre de grandeur plus long).
Dans l'exemple, supposons que mesure est la colonne sur laquelle vous calculez le classement en pourcentage, et id est juste un identifiant de ligne (non obligatoire) :
SELECT
id,
@prev := @curr as prev,
@curr := measure as curr,
@rank := IF(@prev > @curr, @[email protected], @rank) AS rank,
@ties := IF(@prev = @curr, @ties+1, 1) AS ties,
([email protected]/@total) as percentrank
FROM
mytable,
(SELECT
@curr := null,
@prev := null,
@rank := 0,
@ties := 1,
@total := count(*) from mytable where measure is not null
) b
WHERE
measure is not null
ORDER BY
measure DESC
Le mérite de cette méthode revient à Shlomi Noach. Il en parle en détail ici :
http://code.openark.org/blog/mysql /classement-sql-sans-auto-jointure
J'ai testé cela dans MySQL et cela fonctionne très bien; aucune idée sur Oracle, SQLServer, etc.