【问题标题】:Query listing the name, surname and salary information of the employees with the highest salary in each unit. (With a single query)?查询列出各单位工资最高的员工的姓名、姓氏和工资信息。 (使用单个查询)?
【发布时间】:2021-04-16 04:34:39
【问题描述】:

表 1

 drop table Department
    create table  Department (
        dep_id int primary key not null,
        dep_name char(50)
    )

表 2

create table Employee (
    emp_id int primary key not null,
    name char(50),
    surname char(50),
    salary int ,
    emp_dep_id int references Department(dep_id) not null
    )

添加数据

insert into Department values
        ('1','A'),
        ('2','B'),
        ('3','C')

insert into Employee values 
    ('1','Susan','James','100000','1'),
    ('2','Steve','Jones','80000','1'),
    ('3','John','Connors','300000','2'),
    ('4','Adrian','Ball','500000','3'),
    ('5','Amy','Smith','500000','3'),
    ('6','Jane','Smith','200000','2'),
    ('7','June','Smyth','75000','1'),
    ('8','Jill','Hanlon','90000','3')

如何获取各部门工资最高的员工的姓名、姓氏、工资信息? (使用单个查询)。

我想要一张像下面这样的表格。

name                  surname                  salary 
Susan                 James                    100000
John                  Connors                  300000
Andrian               Ball                     500000

【问题讨论】:

  • 根据问题指南,请展示您的尝试并告诉我们您发现了什么(在本网站或其他地方)以及为什么它不能满足您的需求。

标签: sql sql-server database tsql


【解决方案1】:

试试这样的。您使用分区拆分部门,按薪水排序,然后将数据插入临时表。然后从每组中选出前一个。

SELECT
    ROW_NUMBER() OVER(PARTITION BY emp_dep_id ORDER BY salary DESC) [RowNum],
    Name,
    Surname,
    Salary
INTO #tempValues
FROM
    employe

SELECT * FROM #tempValues WHERE RowNum = 1

DROP TABLE #tempValues

如果你不想使用临时表,你可以这样做:

SELECT
    X.*
FROM
(
    SELECT
        ROW_NUMBER() OVER(PARTITION BY emp_dep_id ORDER BY salary DESC) [RowNum],
        Name,
        Surname,
        Salary
    FROM
        employe
) AS X
WHERE
    X.RowNum = 1

【讨论】:

    【解决方案2】:

    这很容易使用window functions 完成,为每个组分配一个序列并按薪水排序,然后过滤:

    select name, surname, salary from (
        select *, row_number() over(partition by emp_dep_id order by salary desc) rn
        from employee
    )e
    where rn=1
    

    问题响应。

    我可以想出多种方法来获得相同的结果,但是都需要在所有行与具有最高薪水的行之间建立某种相关性,并且相关性(无论是子查询还是交叉应用)需要使用 select

    您的问题标题仅说明了一个查询,即:例如,您可以将临时表用于中间结果并从中进行选择,在这种情况下,这肯定是两个查询 - 但是我看不出上面如何无法满足作为单个查询的条件,它是关于尽可能简洁明了。

    不过,我们一直在学习,所以如果您确实找到了解决方案,请在此处发布 - 我真的很好奇!

    【讨论】:

    • 是否有任何选项可以通过一次选择操作获得完全相同的解决方案?因为我只能使用一次 select 。正如我提到的,我的老师想要。谢谢。
    • @mrProgrammer 我开始回复评论但空间不足,所以在上面的答案中添加了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-24
    • 1970-01-01
    • 2020-08-21
    • 2012-08-02
    相关资源
    最近更新 更多