2009-08-11 9 views
7

Ho una tabella come questa:studenti Classifica di Grado in SQL

 
Date  StudentName Score 

01.01.09 Alex   100 
01.01.09 Tom   90 
01.01.09 Sam   70 
01.02.09 Alex   100 
01.02.09 Tom   50 
01.02.09 Sam   100 

Ho bisogno di classificare gli studenti nella tabella dei risultati in base al punteggio entro date diverse, in questo modo:

 
Date  Student   Rank 

01.01.09 Alex    1 
01.01.09 Tom    2 
01.01.09 Sam    3 
01.02.09 Alex    1 
01.02.09 Sam    1 
01.02.09 Tom    2 

Come posso farlo in SQL?

risposta

28

si desidera utilizzare la funzione rank in T-SQL:

select 
    date, 
    student, 
    rank() over (partition by date order by score desc) as rank 
from 
    grades 
order by 
    date, rank, student 

La magia è nella clausola over. Vedi, divide le classifiche per date, quindi ordina tali sottoinsiemi per score. Brillante, eh?

+1

+1 bella risposta, impari qualcosa di nuovo ogni giorno :) –

+0

+1 - sì, mai sentito parlare di 'rank' –

+0

La clausola' over' è sorprendente. Puoi fare qualsiasi funzione di aggregazione con una 'partition by'. Roba molto carina – Eric

1

Si dovrebbe usare ORDER BY:

SELECT * FROM Students ORDER BY Date,Rank 

che ordinerà i dati per data, quindi rango. È possibile aggiungere tutti i campi che si desidera, purché siano comparabili (non è possibile confrontare i BLOB oi campi di testo lunghi).

Spero che questo aiuti.

-1

È necessario scrivere una funzione che il computer rango per un dato studente e la data. Quindi puoi "ORDINA PER Data, Classifica()"

+1

Questa è una pessima idea. La funzione rank() dovrebbe consultare la tabella e so che il server SQL non lo unirà alla query (non sono sicuro degli altri DBMS, ma mi sorprenderebbe). – erikkallen

Problemi correlati