Aquí hay un enfoque diferente que no requiere una unión. En mi caso (una tabla con más de 15 000) filas, se ejecuta en unos 3 segundos. (El método JOIN toma un orden de magnitud más largo).
En el ejemplo, suponga que medir es la columna en la que está calculando el rango porcentual y id es solo un identificador de fila (no obligatorio):
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
El crédito por este método es para Shlomi Noach. Él escribe sobre esto en detalle aquí:
http://code.openark.org/blog/mysql /sql-ranking-sin-self-join
He probado esto en MySQL y funciona muy bien; ni idea sobre Oracle, SQLServer, etc.