Напишите запрос, чтобы выбрать ENAME (имена сотрудников), которые получают самые высокие зарплаты в своем отделе

#sql #sql-server #sql-server-2008 #plsql #sql-server-2012

#sql #sql-сервер #sql-server-2008 #plsql #sql-server-2012

Вопрос:

Я создал приведенную ниже таблицу в MSSQLServer и вставил дополнительные строки.

 (
     EID int,
     ENAME nvarchar(50),
     DEPT nvarchar(50),
     Salary int
)
GO

Insert into Emp11 values (1, 'A','Dev', 60000)
Insert into Emp11 values (2, 'B','Dev', 60000)
Insert into Emp11 values (3, 'C','Support', 60000)
Insert into Emp11 values (4, 'D','Support', 30000)
Insert into Emp11 values (5, 'E','Reporting', 30000)
Insert into Emp11 values (6, 'F','Reporting', 70000)
Insert into Emp11 values (7, 'G','Reporting', 70000)
Insert into Emp11 values (8, 'H','QA', 70000)
Insert into Emp11 values (9, 'I','QA', 90000)
Insert into Emp11 values (10,'J','QA', 90000
  

Я запускаю этот запрос-

 select ename, salary, DEPT from(
    select *
        , row_number() over (partition by DEPT order by salary desc) as rn
    from EMP11
)a where rn=1

--Result->
ename  salary   DEPT
A      60000    Dev
I      90000    QA
F      70000    Reporting
C      60000    Support
  

Я хочу получить более 1 имени, если они получают ту же зарплату, что и самая высокая зарплата в их отделе, т. Е:

 ENAME   salary  DEPT
A   60000   Dev
B   60000   Dev
I   90000   QA
J   90000   QA
F   70000   Reporting
G   70000   Reporting
C   60000   Support
  

Ответ №1:

Используйте rank() ; в отличие от row_number() , который гарантирует уникальность каждого номера, он присваивает одинаковый ранг строкам с одинаковым значением:

 select ename, salary, dept
from (
    select *, rank() over (partition by dept order by salary desc) as rn
    from emp11
) a 
where rn = 1
  

Комментарии:

1. Да, он возвращает ожидаемые результаты. Спасибо за ответ!!