2012-06-20 3 views
3

У меня есть запрос, который создает результирующий набор, как это:SQL Server выберите первый экземпляр ранжированных данных

Rank Name 
1  Fred 
1  John 
2  Mary 
2  Fred 
2  Betty 
3  John 
4  Betty 
4  Frank 

мне нужно затем выбрать самый низкий ранг для каждого имени, например:

Rank Name 
1  Fred 
1  John 
2  Mary 
2  Betty 
4  Frank 

Можно ли это сделать в TSQL?

ответ

6
SELECT MIN(Rank) AS Rank, Name 
FROM TableName 
GROUP BY Name 
4

да

select name, min(rank) 
from nameTable 
group by name 
3

Как Paul + Кевин уже отмечали, простые случаи возвращения значения из совокупности могут быть извлечены с помощью MIN/MAX и т.д. (только отметить, что RANK является зарезервированным словом)

В более общем/сложном случае, например где вам нужно найти второй/N-й наивысший ранг, вы можете использовать PARTITION с ROW_NUMBER(), чтобы сделать ранжирование, а затем отфильтровать по рангу.

SELECT [Rank], [Name] 
FROM 
(
    SELECT [RANK], [Name], 
      ROW_NUMBER() OVER (PARTITION BY [Name] ORDER BY [Rank]) as [RowRank] 
    FROM [MyTable] 
) AS [MyTableReRanked] 
WHERE [RowRank] = @N 
ORDER BY [Rank]; 
+1

Спасибо @StuartLC. Помог с проблемой, связанной со вторым самым высоким для меня. –

Смежные вопросы