2009-08-11 19 views
7

que tienen una tabla como la siguiente:estudiantes ranking por Grado en 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 

necesito para clasificar a los estudiantes en la tabla de resultados por puntuación dentro de diferentes fechas, como este:

 
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 

Cómo ¿Puedo hacer esto en SQL?

Respuesta

28

que desea utilizar la función rank en 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 está en la cláusula over. Ver, divide esos rankings por date, y luego ordena esos subconjuntos por score. Brillante, ¿eh?

+1

+1 buena respuesta, aprendes algo nuevo todos los días :) –

+0

+1 - sí, nunca escuché sobre 'rank' –

+0

La cláusula' over' es increíble. Puede hacer cualquier función agregada con una 'partition by'. Cosas muy ordenadas – Eric

1

Debe utilizar ORDER BY:

SELECT * FROM Students ORDER BY Date,Rank 

que ordenará los datos por fecha, entonces rango. Puede agregar tantos campos como desee, siempre que sean comparables (no puede comparar BLOB ni campos de texto largos).

Espero que ayude.

-1

Usted tiene que escribir una función que hará equipo el rango de un estudiante y fecha determinada. Entonces puedes "ORDEN POR Fecha, Rango()"

+1

Esta es una idea increíblemente mala. La función rank() necesitaría consultar la tabla, y sé que el servidor sql no lo fusionará en la consulta (aunque no estoy seguro de otros DBMS, pero me sorprendería). – erikkallen

Cuestiones relacionadas