sql >> Databasteknik >  >> RDS >> Mysql

Beräknar percentilrankning i MySQL

Här är ett annat tillvägagångssätt som inte kräver en anslutning. I mitt fall (en tabell med 15 000+) rader körs den på cirka 3 sekunder. (JOIN-metoden tar en storleksordning längre).

Antag att mått i provet är den kolumn som du beräknar procentandelen på, och id är bara en radidentifierare (ingår ej):

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

Kredit för denna metod går till Shlomi Noach. Han skriver om det i detalj här:

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

Jag har testat detta i MySQL och det fungerar utmärkt; ingen aning om Oracle, SQLServer, etc.



  1. Salesforce SOQL från Java

  2. MySql Modifierat förbeställningsträd för att skapa url

  3. MySQL Full-text Search Lösning för innoDB-tabeller

  4. Postgres släpptabell syntaxfel