각 등급별 상위 5명 임금 선택

질문:

이와 유사한 양식이 있습니다.
id   sml  desc amount
1     23   bla   100
2     23   bla   50
3     23   bla   30
4     23   bla   20
1     40   bla1  100
2     40   bla2  23
3     40   bla3  34
4     40   bla4  34
그것은 다른 테이블의 여러 연결에서 나온 결과이다.나는 매 amount치의 선택sml열에서 가장 가치가 높은 다섯 명의 직원을 원한다.
다음 예시 출력: (내 예시에는 다섯 개sml가 없기 때문에 나는 두 개만 표시한다.또한 다섯 번째와 여섯 번째 값이 같으면 이 두 값을 되돌려주고 싶습니다)
id   sml  desc amount
1     23   bla   100
2     23   bla   50
1     40   bla1  100
2     40   bla2  100
3     40   bla3  34
다음 쿼리를 시도했습니다.
select [MS_EmployeeNumber],[SA_Semel],[Description],sum([MS_Amount]) as Amount,
rank() over (Partition BY [SA_Semel], [Description]

select [MS_EmployeeNumber],[SA_Semel],[Description],sum([MS_Amount]) as Amount,
rank() over (Partition BY [SA_Semel], [Description]
                ORDER BY sum([MS_Amount]) Desc) AS Rank
from [dbo].[MonthlySalary] as sml
inner join [dbo].[SmlAnalyse] as SA on SA.SA_Semel = sml.MS_Semel
inner join [dbo].[SalarySMLlist] as list on list.Semel = SA.SA_Semel
group by [MS_EmployeeNumber],[SA_Semel],[Description]
order by SA_Semel, Amount desc
내가 이 프로그램을 실행할 때, 랭킹은 all표에서 그의 일을 실행하고, 나의 요구, 즉 Semel 여사 위에서 랭킹을 실행하는 것을 고려한다.

답안

나는 너의 문제가 너무 복잡하다고 생각한다.rank(또는 더 정확히 말하면 dense_rank, 당신이 던전을 처리하는 방식에 따라)persml의 랭킹을 제공했으니 이제 그에 상응하는 선별만 하면 됩니다.
SELECT [id], [sml], [desc], [amount]
FROM   (SELECT [id], [sml], [desc], [amount], 
               DENSE_RANK() OVER (PARTITION BY [sml] ORDER BY [amount] DESC) rk
        FROM   [dbo].[MonthlySalary]) t
WHERE  rk <= 5