Highest Salary in each department

前端 未结 30 1449
没有蜡笔的小新
没有蜡笔的小新 2021-01-30 22:16

I have a table EmpDetails:

DeptID      EmpName   Salary
Engg        Sam       1000
Engg        Smith     2000
HR          Denis     1500
HR                  


        
30条回答
  •  一生所求
    2021-01-30 23:10

    I have like 2 approaches using one with Rank and the other with ROW_NUMBER

    This is my sample data

    Age          Name                                               Gender     Salary
    ----------- -------------------------------------------------- ---------- -----------
    1           Mark                                               Male       5000
    2           John                                               Male       4500
    3           Pavan                                              Male       5000
    4           Pam                                                Female     5500
    5           Sara                                               Female     4000
    6           Aradhya                                            Female     3500
    7           Tom                                                Male       5500
    8           Mary                                               Female     5000
    9           Ben                                                Male       6500
    10          Jodi                                               Female     7000
    11          Tom                                                Male       5500
    12          Ron                                                Male       5000
    13          Ramani                                             Female     7000
    

    So here is my first query to find max salary and the person with that max salary for each Gender

        with CTE as(
        select RANK() over(partition by Gender Order by Salary desc) as [Rank],* from employees)
        select * from CTE where [Rank]=1
    
    
    Rank                 Age          Name                                               Gender     Salary
    -------------------- ----------- -------------------------------------------------- ---------- -----------
    1                    10          Jodi                                               Female     7000
    1                    13          Ramani                                             Female     7000
    1                    9           Ben                                                Male       6500
    

    So in this case, we can see there is a tie between these 2 female employees "Jodi" and "Ramani". In that case, As a tie-breaker I want to make use of Age as a deciding factor and person with more age is supposed to be displayed

    with CTE as(
    select RANK() over(partition by Gender Order by Salary desc,age desc) as [Rank],* from employees)
    select * from CTE where [Rank]=1
    
    Rank                 Age          Name                                               Gender     Salary
    -------------------- ----------- -------------------------------------------------- ---------- -----------
    1                    13          Ramani                                             Female     7000
    1                    9           Ben                                                Male       6500
    

    Usually, in this case for finding the highest salary, it doesn't make much difference even if Rank, Dense_Rank, or Row_Number() are used. But they have some impact in other cases.

提交回复
热议问题