Mysql
 sql >> Base de données >  >> RDS >> Mysql

Calcul du rang centile dans MySQL

Voici une approche différente qui ne nécessite pas de jointure. Dans mon cas (une table avec plus de 15 000) lignes, elle s'exécute en 3 secondes environ. (La méthode JOIN prend un ordre de grandeur plus long).

Dans l'exemple, supposons que mesure est la colonne sur laquelle vous calculez le classement en pourcentage, et id est juste un identifiant de ligne (non obligatoire) :

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

Le mérite de cette méthode revient à Shlomi Noach. Il en parle en détail ici :

http://code.openark.org/blog/mysql /classement-sql-sans-auto-jointure

J'ai testé cela dans MySQL et cela fonctionne très bien; aucune idée sur Oracle, SQLServer, etc.