Đây là một cách tiếp cận khác không yêu cầu tham gia. Trong trường hợp của tôi (một bảng có hơn 15.000) hàng, nó chạy trong khoảng 3 giây. (Phương thức JOIN có thứ tự độ lớn dài hơn).
Trong mẫu, giả sử rằng đo lường là cột mà bạn đang tính toán xếp hạng phần trăm và id chỉ là một định danh hàng (không bắt buộc):
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
Tín dụng cho phương pháp này thuộc về Shlomi Noach. Anh ấy viết chi tiết về nó ở đây:
http://code.openark.org/blog/mysql / sql-rank-without-self-join
Tôi đã thử nghiệm điều này trong MySQL và nó hoạt động rất tốt; không biết gì về Oracle, SQLServer, v.v.