Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Calculando a classificação do percentil no MySQL


Aqui está uma abordagem diferente que não requer uma junção. No meu caso (uma tabela com mais de 15.000) linhas, ele é executado em cerca de 3 segundos. (O método JOIN leva uma ordem de magnitude mais longa).

No exemplo, suponha que medir é a coluna na qual você está calculando a classificação percentual e id é apenas um identificador de linha (não obrigatório):
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

O crédito por este método vai para Shlomi Noach. Ele escreve sobre isso em detalhes aqui:

http://code.openark.org/blog/mysql /sql-ranking-without-self-join

Eu testei isso no MySQL e funciona muito bem; nenhuma ideia sobre Oracle, SQLServer, etc.