No SQL Server 2008, estou usando RANK() OVER (PARTITION BY Col2 ORDER BY Col3 DESC)
para retornar o conjunto de dados com RANK
. Mas eu tenho centenas de registros para cada partição, então obterei valores de rank 1, 2, 3......999. Mas eu quero apenas até 2 RANKs
em cada PARTITION
.
Exemplo:
ID Name Score Subject
1 Joe 100 Math
2 Jim 99 Math
3 Tim 98 Math
4 Joe 99 History
5 Jim 100 History
6 Tim 89 History
7 Joe 80 Geography
8 Tim 100 Geography
9 Jim 99 Geography
Eu quero que o resultado seja:
SELECT Subject, Name, RANK() OVER (PARTITION BY Subject ORDER BY Score DESC)
FROM Table
Subject Name Rank
Math Joe 1
Math Jim 2
History Jim 1
History Joe 2
Geography Tim 1
Geography Jim 2
Eu quero apenas rank 1 e 2 em cada categoria. Como eu faço isso?
Você pode colocar a consulta original using
rank()
em uma subconsulta e envolvê-la com uma consulta que filtra os resultados.Acho que a maneira de fazer isso no SQL Server é combinar a função de janela com uma expressão de tabela comum:
Para Teradara, alternativamente, você pode fazer: