2017-07-03 1 views
-3

Je veux trouver top 2 salariés dans chaque départementTrouver les deux valeurs les plus élevées dans chaque groupe

table => staff_masters ayant colonne « staff_name » pour le personnel et « dept_code » pour le département correspondant.

J'ai essayé d'aimer ce

SELECT TOP 2 staff_sal 
FROM staff_masters 
GROUP BY dept_code; 

S'il vous plaît utiliser la clause group by.

+0

Je souhaite utiliser la clause group by. Y'a-t'il un quelconque moyen d'y arriver? –

+0

'GROUP BY' est pour [agrégation] (https://en.wikipedia.org/wiki/Aggregate_function). Vous, cependant, demandez [ranking] (https://en.wikipedia.org/wiki/Ranking). –

+0

indice pour cette tâche était "utiliser la clause GROUP BY". Alors, comment puis-je faire cela en utilisant cela? –

Répondre

0

Vous pouvez le faire avec une fonction fenêtré Row_Number():

Select Dept_Code, Staff_Sal 
From 
(
    Select Dept_Code, Staff_Sal, 
      Row_Number() Over (Partition By Dept_Code Order By Staff_Sal Desc) As RN 
    From Staff_Masters 
) A 
Where RN <= 2 
Order By Dept_Code, RN 
+0

indice pour cette tâche était "utiliser la clause GROUP BY". Alors, comment puis-je faire cela en utilisant cela? –

+1

@ShyamSundar Ce n'est pas ce à quoi 'GROUP BY' est destiné ...' GROUP BY' est pour * aggregation * ... 'ROW_NUMBER' est pour le classement. Vous n'essayez pas d'effectuer l'agrégation, vous essayez d'effectuer le classement, vous devez donc utiliser ROW_NUMBER. Vous ne serez pas en mesure d'obtenir cela avec «GROUP BY». – Siyual

+0

Ok alors merci pour le e –

1

Vous utiliseriez row_number():

select sm.* 
from (select dept_code, staff_sal, 
      row_number() over (partition by dept_code order by staff_sal desc) as seqnum 
     from staff_masters 
    ) sm 
where seqnum <= 2; 

Si vous voulez distincts salaires, vous devez utiliser dense_rank() plutôt que row_number().

+0

indice pour cette tâche était "utiliser la clause GROUP BY". Alors, comment puis-je faire cela en utilisant cela? –