Mysql
 sql >> Database >  >> RDS >> Mysql

Calcolo del rango percentile in MySQL

Ecco un approccio diverso che non richiede un'unione. Nel mio caso (una tabella con oltre 15.000 righe), viene eseguita in circa 3 secondi. (Il metodo JOIN richiede un ordine di grandezza più lungo).

Nell'esempio, supponi che misura è la colonna su cui stai calcolando il ranking percentuale e id è solo un identificatore di riga (non richiesto):

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

Il merito di questo metodo va a Shlomi Noach. Ne scrive in dettaglio qui:

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

L'ho testato in MySQL e funziona benissimo; nessuna idea di Oracle, SQLServer, ecc.