【问题标题】:Write a query to select ENAME(Employee names) who get the highest salaries from their DEPT编写查询以选择从其部门获得最高薪水的 ENAME(员工姓名)
【发布时间】:2021-01-03 16:04:24
【问题描述】:

我在 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,即:

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

【问题讨论】:

    标签: sql sql-server sql-server-2008 plsql sql-server-2012


    【解决方案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
    

    【讨论】:

    • 是的,它返回了预期的结果。感谢您的回答!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多