2017-05-08 1 views
-2

Je veux classer le tableau de scores suivant où les mêmes scores auront le même rang.rank() fonction SQL

+----+-------+ 
| Id | Score | 
+----+-------+ 
| 1 | 3.50 | 
| 2 | 4.00 | 
| 3 | 4.00 | 
| 4 | 3.50 | 
+----+-------+ 

Quelqu'un peut-il aider pourquoi la requête suivante lève-t-elle une erreur de syntaxe? De plus, la logique est-elle incorrecte?

code:

select Score, RANK() OVER (order by Score desc) as rank 
from Scores 
order by Score desc; 

Message d'erreur:

Line 1: SyntaxError: near '(order by Score desc) as rank 
from Scores 
order by Score desc' 
+3

MYSQL ne supporte pas encore les fonctions de fenêtre – GurV

+0

Aah - ça l'explique. Merci! –

Répondre

1

Par exemple: (Et en supposant que vous voulez rangs 1 et 2 au lieu de 1 et 3)

SELECT x.* 
    , CASE WHEN @prev = score THEN @i:[email protected] ELSE @i:[email protected]+1 END rank 
    , @prev:=score 
    FROM my_table x 
    , (SELECT @prev:=null,@i:=0) vars 
ORDER 
    BY score DESC 
    , id; 

Pour les sports classement, vous pouvez le faire:

SELECT a.* 
    , FIND_IN_SET(score, 
        (SELECT GROUP_CONCAT(score ORDER BY score DESC) 
         -- inclusion of DISTINCT here will output as above 
         FROM my_table) 
        ) x 
    FROM my_table a; 

Mais il y a certaines mises en garde associées à cette solution

+0

Je pense que 'cross join' sera meilleur que', '. – Blank

+0

C'est vraiment intelligent! Illisible mais agréable – AxelH

+0

@Forward. Non, c'est pareil. – Strawberry