首页 > 其他分享 >TopN问题通解

TopN问题通解

时间:2024-12-10 10:57:19浏览次数:11  
标签:salary name 通解 问题 TopN departmentId Department Employee id

目录

1. 力扣链接

2. 经典例题

3. 分析

4. 代码实现

5. 代码验证

6. 总结


1. 力扣链接

185. 部门工资前三高的所有员工

2. 经典例题

表: Employee

+--------------+---------+
| Column Name  | Type    |
+--------------+---------+
| id           | int     |
| name         | varchar |
| salary       | int     |
| departmentId | int     |
+--------------+---------+
id 是该表的主键列(具有唯一值的列)。
departmentId 是 Department 表中 ID 的外键(reference 列)。
该表的每一行都表示员工的ID、姓名和工资。它还包含了他们部门的ID。

表: Department

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| id          | int     |
| name        | varchar |
+-------------+---------+
id 是该表的主键列(具有唯一值的列)。
该表的每一行表示部门ID和部门名。

公司的主管们感兴趣的是公司每个部门中谁赚的钱最多。一个部门的 高收入者 是指一个员工的工资在该部门的 不同 工资中 排名前三 。

编写解决方案,找出每个部门中 收入高的员工 。

以 任意顺序 返回结果表。

返回结果格式如下所示。

示例 1:

输入: 
Employee 表:
+----+-------+--------+--------------+
| id | name  | salary | departmentId |
+----+-------+--------+--------------+
| 1  | Joe   | 85000  | 1            |
| 2  | Henry | 80000  | 2            |
| 3  | Sam   | 60000  | 2            |
| 4  | Max   | 90000  | 1            |
| 5  | Janet | 69000  | 1            |
| 6  | Randy | 85000  | 1            |
| 7  | Will  | 70000  | 1            |
+----+-------+--------+--------------+
Department  表:
+----+-------+
| id | name  |
+----+-------+
| 1  | IT    |
| 2  | Sales |
+----+-------+
输出: 
+------------+----------+--------+
| Department | Employee | Salary |
+------------+----------+--------+
| IT         | Max      | 90000  |
| IT         | Joe      | 85000  |
| IT         | Randy    | 85000  |
| IT         | Will     | 70000  |
| Sales      | Henry    | 80000  |
| Sales      | Sam      | 60000  |
+------------+----------+--------+
解释:
在IT部门:
- Max的工资最高
- 兰迪和乔都赚取第二高的独特的薪水
- 威尔的薪水是第三高的

在销售部:
- 亨利的工资最高
- 山姆的薪水第二高
- 没有第三高的工资,因为只有两名员工
-- 建表语句
Create table If Not Exists Employee (id int, name varchar(255), salary int, departmentId int)
Create table If Not Exists Department (id int, name varchar(255))
Truncate table Employee
insert into Employee (id, name, salary, departmentId) values ('1', 'Joe', '85000', '1')
insert into Employee (id, name, salary, departmentId) values ('2', 'Henry', '80000', '2')
insert into Employee (id, name, salary, departmentId) values ('3', 'Sam', '60000', '2')
insert into Employee (id, name, salary, departmentId) values ('4', 'Max', '90000', '1')
insert into Employee (id, name, salary, departmentId) values ('5', 'Janet', '69000', '1')
insert into Employee (id, name, salary, departmentId) values ('6', 'Randy', '85000', '1')
insert into Employee (id, name, salary, departmentId) values ('7', 'Will', '70000', '1')
Truncate table Department
insert into Department (id, name) values ('1', 'IT')
insert into Department (id, name) values ('2', 'Sales')

3. 分析

  1. 目标表需要输出部门名称,由此分析出需要进行两个表的jion关联
  2. 需求是找出每个部门中收入前三的员工,由此分析出需要对部门分组对收入进行排名
  3. 由于考虑到收入有相同的可能,则分析出要使用dense_rank进行排名
  4. 对排名后的结果进行where条件过滤,求出目标表

4. 代码实现

with tmp as(
    select
        d.name Department,
        e.name Employee,
        Salary,
        dense_rank() over(partition by d.id order by salary desc) rn
    from Department d 
    join Employee e on d.id = e.departmentId
)
select
    Department,
    Employee,
    Salary 
from tmp where rn <= 3;

5. 代码验证

6.相同类型题目练习

176. 第二高的薪水

184. 部门工资最高的员工

177. 第N高的薪水

7. 总结

  • 熟悉表不同关联方式的区别
  • 熟悉开窗函数的用法
  • 熟悉三种排名函数rank、dense_rank、row_number的区别

标签:salary,name,通解,问题,TopN,departmentId,Department,Employee,id
From: https://blog.csdn.net/qq_58114907/article/details/144357226

相关文章

  • 解决升级SpringBoot3 JPA报Could not locate TableGroup问题
    产品技术架构从SpringBoot2.x升级到SpringBoot3.x后,对原有代码进行单元测试时发现,之前通过CriteriaQuery查询对象实现的分页查询功能,在进行记录数count查询时,会抛出SqlTreeCreationException:CouldnotlocateTableGroup异常。通过排查发现,SpringBoot2.x依赖的是Hibernate5.x,S......
  • html的开始与结束标签嵌套错误会导致哪些问题?
    HTML标签嵌套错误会导致一系列问题,从轻微的显示异常到严重的页面崩溃。以下是几种常见的情况以及它们可能造成的影响:1.显示错乱:重叠或错位的元素:错误的嵌套会导致元素的布局和定位出现问题。例如,如果一个<div>内部错误地嵌套了另一个未正确闭合的<div>,可能会导致内部的......
  • Element UI 相关问题及使用技巧总结
    1、Elementui组件el-cascader单选框需要单击两次才能选中?感觉这个与组件的v-model绑定的参数值有关如下,如果参数如b参数放在对象中则会有问题,像a一样定义,不要放在对象中例如,v-model绑定值a就解决了data(){return{a:null,obj:{b:null}}......
  • 说说你对持续集成的理解,它解决什么问题以及如何在前端中运用?
    持续集成(ContinuousIntegration,简称CI)是一种软件开发实践,旨在频繁地将代码集成到共享存储库中。每次集成都通过自动化的构建(包括编译、打包、测试)来验证,从而尽早地发现集成错误。CI解决的问题:尽早发现集成问题:传统的开发模式中,集成通常发生在项目后期,此时解决冲突的成本非常......
  • 如何解决“抱歉!该域名未绑定到站点”的问题?
    解决“抱歉!该域名未绑定到站点”的问题,可以按照以下步骤进行:确保绑定域名是否正确:登录宝塔面板,进入“网站”管理页面,检查你已经添加的站点,确保域名、路径等信息正确无误。确认域名已经正确解析到服务器的IP地址。可以在本地终端或命令行工具中使用ping命令测试域名解析是否......
  • 多机度调度问题
    多机调度问题(MultiprocessorSchedulingProblem)是一个经典的组合优化问题,通常涉及到将一系列任务分配给多个处理器,目标是找到一种分配方式,使得完成所有任务所需的总时间(通常称为“Makespan”)最小。以下是一个简单的C语言程序示例,用于解决多机调度问题。我们将使用一种近似算......
  • 服务迁移之《mysql数据同步问题》
    我们大概是从2022年十月份开始进行拆分的。面对一百多个服务的时候,真的是无从下手,然后公司突然空降了一个从阿里出来的架构师,然后就带着我们大刀阔斧的整体迁移。先是服务器购买阿里云的,然后从几个核心的服务开始迁移,发现会依赖很多的基础的原子服务。然后就开始迁移基础,基础服务......
  • 2024 PyCharm安装激活使用教程(常见问题)
    第一步:下载PyCharm安装包访问PyCharm官网,下载PyCharm也可以在这里点击下载PyCharm(含博主使用版本)下载PyCharm第二步:安装PyCharm下载完成后,进行安装,next,安装完成点击xx关掉程序!第三步:下载补丁PyCharm补丁文件点击获取补丁下载成功后,打开标注的文件文件夹,......
  • 解决CSDN不登录就不能复制代码的问题
    1、在书签栏加一个书签2、在网址输入框中填入如下代码3、以后每次想要复制之前点击一下这个书签,就可以自由复制CSDN的代码啦 javascript:window.oncontextmenu=document.oncontextmenu=document.oncopy=null;[...document.querySelectorAll('body')].forEach(dom=>dom.oute......
  • Vue3 状态管理问题(Vuex / Pinia)
    Vue3状态管理问题详解(Vuex/Pinia)引言随着前端应用复杂度的不断增加,状态管理成为开发者面临的一个关键挑战。Vue.js作为流行的前端框架,提供了多种状态管理解决方案,其中最为广泛使用的两种是Vuex和Pinia。在Vue3的发布后,Pinia逐渐崭露头角,成为Vuex的有力竞争者。......