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

Beregning af percentilrangering i MySQL

Her er en anden tilgang, der ikke kræver tilslutning. I mit tilfælde (en tabel med 15.000+) rækker kører den på cirka 3 sekunder. (JOIN-metoden tager en størrelsesorden længere).

I eksemplet antages det mål er den kolonne, hvorpå du beregner den procentvise rangering og id er kun en række-id (ikke påkrævet):

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

Æren for denne metode går til Shlomi Noach. Han skriver om det i detaljer her:

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

Jeg har testet dette i MySQL, og det fungerer godt; ingen idé om Oracle, SQLServer osv.



  1. Bruger gruppe efter på to felter og tæl i SQL

  2. Tilslutning til MySQL forårsager fejl. Datakildenavn blev ikke fundet, og ingen standarddriver angivet

  3. Hvordan pivoterer man ukendt antal kolonner og ingen aggregater i SQL Server?

  4. Afrunding af en MYSQL datetime til tidligste 15 minutters interval i millisekunder (PHP)