Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Obliczanie rangi centylowej w MySQL

Oto inne podejście, które nie wymaga sprzężenia. W moim przypadku (tabela z 15 000+) wierszami działa w około 3 sekundy. (Metoda JOIN zajmuje o rząd wielkości dłużej).

W przykładzie załóżmy, że miara to kolumna, według której obliczasz pozycję procentową, a id to tylko identyfikator wiersza (niewymagany):

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

Zasługa tej metody należy do Shlomi Noach. Pisze o tym szczegółowo tutaj:

http://code.openark.org/blog/mysql /sql-ranking-bez-sam-dołączenia

Przetestowałem to w MySQL i działa świetnie; nie mam pojęcia o Oracle, SQLServer itp.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. symfony 1.4 propel:build-all nie działa na Mysql 5.5

  2. Przygotowana instrukcja Mysqli (zapobieganie wstrzykiwaniu SQL)

  3. Najszybszy sposób na wstawienie 134675 wartości do zdalnej bazy danych

  4. Używanie JQuery do wstawiania wartości do mySQL

  5. Niezdefiniowana funkcja mysql_connect()