Search code examples
mysqldense-rankmariadb-10.3

MySQL dense_rank not skipping numbers


I fairly new to MYSQL and I'm having trouble getting dense rank to work correctly, I was hoping someone would be able to help adjust my query to get the desired results. Issue I'm having is after a ranking that is the same it goes to the next number instead of skipping a number. I have shown both current results and desired results below.

        SELECT  gameid,
            score
         , IF(score <> @pscore,@i:=@i+1,@i:=@i) rank
         , @pscore := score          
        FROM playerstats x
        , (SELECT @i:=0,@prev:='',@pscore:='') vars 
        ORDER 
        BY score DESC;

Current Results:

Current Results

Desired Results:

Desired Results


Solution

  • Basically you need to sort the tdata before you rank it. MySQL

    CREATE TABLE playerstats  (
      `Score` INTEGER,
      `Player` VARCHAR(11)
    );
    
    INSERT INTO playerstats 
      (`Score`, `Player`)
    VALUES
      ('2543', 'jkoffa'),
      ('2204', 'probins'),
      ('2010', 'rwatson'),
      ('2010', 'nbk'),
      ('2010', 'tthamos'),
      ('1950', 'en,acdonald'),
      ('1927', 'dmaginis');
    
    SELECT
    `Player`
    ,IF(@score <> `Score` , @rn := @rn + @cor +1, @rn:= @rn) rnknumber
    ,IF(@score = `Score` , IF(@cor > 0,@cor := @cor +1,@cor := 1), @cor := 0) correction
    ,@score := `Score` 'Score'
    FROM
    (SELECT `Score`, `Player` FROM playerstats ORDER BY Score DESC) t1
    , (SELECT @score := -1) t2
    ,(SELECT @rn := 0) t3,(SELECT @cor := 0) t4
    
    Player      | rnknumber | correction | Score
    :---------- | :-------- | ---------: | ----:
    jkoffa      | 1         |          0 |  2543
    probins     | 2         |          0 |  2204
    rwatson     | 3         |          0 |  2010
    nbk         | 3         |          1 |  2010
    tthamos     | 3         |          2 |  2010
    en,acdonald | 6         |          0 |  1950
    dmaginis    | 7         |          0 |  1927
    

    db<>fiddle here

    for Mariadb 10.3

    CREATE TABLE playerstats  (
      `Score` INTEGER,
      `Player` VARCHAR(11)
    );
    
    INSERT INTO playerstats 
      (`Score`, `Player`)
    VALUES
     ('2010', 'tthamos'),
      ('1950', 'acdonald'),
      ('1927', 'dmaginis'),
      ('2010', 'nbk'),
      ('2543', 'jkoffa'),
      ('2204', 'probins'),
      ('2010', 'rwatson');
    
    SELECT
    `Player`
    ,IF(@score <> `Score` , @rn := @rn + @cor +1, @rn:= @rn ) rnknumber
    ,IF(@score = `Score` , IF(@cor > 0,@cor := @cor +1,@cor := 1), @cor := 0) correction
    ,@score := `Score` 'Score'
    FROM
    (SELECT `Score`, `Player` FROM playerstats ORDER BY Score DESC LIMIT 18446744073709551615) t1
    , (SELECT @score := -1) t2
    ,(SELECT @rn := 0) t3,(SELECT @cor := 0) t4
    
    Player   | rnknumber | correction | Score
    :------- | :-------- | ---------: | ----:
    jkoffa   | 1         |          0 |  2543
    probins  | 2         |          0 |  2204
    tthamos  | 3         |          0 |  2010
    nbk      | 3         |          1 |  2010
    rwatson  | 3         |          2 |  2010
    acdonald | 6         |          0 |  1950
    dmaginis | 7         |          0 |  1927
    

    db<>fiddle here