これは、結合を必要としない別のアプローチです。私の場合(15,000以上のテーブル)、約3秒で実行されます。 (JOINメソッドは1桁長くかかります。)
サンプルでは、測定と仮定します パーセントランクを計算している列であり、 id 単なる行識別子です(必須ではありません):
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
この方法の功績はShlomiNoachにあります。彼はそれについてここに詳細に書いています:
http://code.openark.org/blog/mysql / sql-ranking-without-self-join
私はこれをMySQLでテストしましたが、うまく機能します。 Oracle、SQLServerなどについてはわかりません。