#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. Да, он возвращает ожидаемые результаты. Спасибо за ответ!!