sql >> Base de Datos >  >> RDS >> Mysql

Cálculo del rango percentil en MySQL

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.