Hier is een andere benadering waarvoor geen join nodig is. In mijn geval (een tabel met 15.000+) rijen, loopt het in ongeveer 3 seconden. (De JOIN-methode duurt een orde van grootte langer).
Neem in het voorbeeld aan dat meten is de kolom waarop u de procentpositie berekent, en id is slechts een rij-ID (niet vereist):
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
Krediet voor deze methode gaat naar Shlomi Noach. Hij schrijft er hier uitgebreid over:
http://code.openark.org/blog/mysql /sql-ranking-zonder-self-join
Ik heb dit getest in MySQL en het werkt prima; geen idee over Oracle, SQLServer, enz.