2015-12-21 25 views
1

我有類似這樣的一個表:選擇前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 

當我運行這個級別上的所有表做他的工作,並考慮我的要求做了排名上MS_Semel。

+0

我不知道我在下面。你能分享一下你希望得到的樣品輸入嗎? – Mureinik

+0

我編輯我的帖子。 – Jordan1200

+0

我沒有分析你的整個查詢。看來你已經知道如何使用排名,所以只需添加你的查詢作爲子查詢和外部選擇與where條件等級<= 5 –

回答

0

我覺得你過於複雜與您的查詢的東西。 rank(或相當dense_rank,按照你的方式似乎是處理重複)已經爲您提供了每sml的排名,現在你只需要相應地過濾:

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 
+0

我認爲'rank()'比'dense_rank()'更合適。考慮值爲100,100,100,100,100,99,98,97,96的情況。我把這個問題解釋爲只想要100年代,而不是全部。 –