sql >> Database >  >> RDS >> Mysql

Percentielrang berekenen in MySQL

Hier is een andere benadering waarvoor geen join nodig is. In mijn geval (een tabel met 15.000+) rijen, loopt het in ongeveer 3 seconden. (De JOIN-methode duurt een orde van grootte langer).

Neem in het voorbeeld aan dat meten is de kolom waarop u de procentpositie berekent, en id is slechts een rij-ID (niet vereist):

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

Krediet voor deze methode gaat naar Shlomi Noach. Hij schrijft er hier uitgebreid over:

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

Ik heb dit getest in MySQL en het werkt prima; geen idee over Oracle, SQLServer, enz.



  1. Selecteer Alle Evenementen met Evenement->Schedule->Datum tussen start- en einddatums in CakePHP

  2. Hoe haal ik het eerste en laatste record van een gegroepeerd record op in een MySQL-query met geaggregeerde functies?

  3. Een kml-bestand maken uit een mysql-database met php

  4. Open source ER-diagramtool voor mysql