Oto inne podejście, które nie wymaga sprzężenia. W moim przypadku (tabela z 15 000+) wierszami działa w około 3 sekundy. (Metoda JOIN zajmuje o rząd wielkości dłużej).
W przykładzie załóżmy, że miara to kolumna, według której obliczasz pozycję procentową, a id to tylko identyfikator wiersza (niewymagany):
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
Zasługa tej metody należy do Shlomi Noach. Pisze o tym szczegółowo tutaj:
http://code.openark.org/blog/mysql /sql-ranking-bez-sam-dołączenia
Przetestowałem to w MySQL i działa świetnie; nie mam pojęcia o Oracle, SQLServer itp.