首页 > 数据库 >力扣刷题——SQL

力扣刷题——SQL

时间:2024-02-06 17:34:50浏览次数:33  
标签:name rank 力扣 Department departmentId SQL Employee id 刷题

力扣刷题——高频SQL50题:

题目链接:https://leetcode.cn/problems/department-top-three-salaries/?envType=study-plan-v2&envId=sql-free-50
185. 部门工资前三高的所有员工:
表:

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

公司的主管们感兴趣的是公司每个部门中谁赚的钱最多。一个部门的高收入者是指一个员工的工资在该部门的不同工资中排名前三
编写解决方案,找出每个部门中收入高的员工
任意顺序返回结果表。
返回结果格式如下所示。

Employee 表:                                         Department 表:  				            输出:                                                             
+----+-------+--------+--------------+               +----+-------+			                    +------------+----------+--------+ 
| id | name  | salary | departmentId |               | id | name  |                             | Department | Employee | Salary | 
+----+-------+--------+--------------+               +----+-------+                             +------------+----------+--------+ 
| 1  | Joe   | 85000  | 1            |               | 1  | IT    |                             | IT         | Max      | 90000  | 
| 2  | Henry | 80000  | 2            |               | 2  | Sales |                             | IT         | Joe      | 85000  | 
| 3  | Sam   | 60000  | 2            |               +----+-------+                             | IT         | Randy    | 85000  | 
| 4  | Max   | 90000  | 1            |                                                          | IT         | Will     | 70000  | 
| 5  | Janet | 69000  | 1            |                                                          | Sales      | Henry    | 80000  | 
| 6  | Randy | 85000  | 1            |                                                          | Sales      | Sam      | 60000  | 
| 7  | Will  | 70000  | 1            |                                                          +------------+----------+--------+ 
+----+-------+--------+--------------+ 

先找出每个department部门分组中的薪水排名前三的员工,再使用子查询进行处理:

一般解决方法:

select d.name as Department,e.name as Employee ,e.Salary  
from Employee e,Department d 
where e.departmentId = d.id(+)
and e.id in (select s1.id from Employee s1,Employee s2 
             where s1.departmentId = s2.departmentId 
             and s1.Salary <= s2.Salary
             group by s1.id
             having count(distinct s2.Salary) <= 3)
and e.departmentId in (select id from Department);

使用开窗函数直接获取:

select aa.Department,aa.Employee,aa.salary 
from  (
    select t2.name as Department,t1.name as Employee,t1.salary ,
    dense_rank() over(partition by departmentId order by salary desc) as rk
from Employee t1,Department t2
where t1.departmentId = t2.id) aa 
where aa.rk <=3;

聚合函数用得好,能省下很大功夫,介绍一下这个开窗函数:
【语法】:
rank() over(partition by column order by column desc)
dense_rank() over(partition by column1 order by column2 asc)

【参数】:
dense_rank() over() 是固定写法;
partition by 是可选参数,用于指定分区的列,类似select中的group by 子句;
order by 用于指定排序的列,类似于 order by子句;

【功能】:
计算一组数值中的排序值

【区别】:
dense_rank() 在遇到并列关系时,相关等级不会跳过;rank() 则是直接跳过该等级;
dense_rank() 是连续排序,有两个第二名时仍然跟着第三名;
rank() 是跳跃排序,有两个第二名时,接下来是第四名;

标签:name,rank,力扣,Department,departmentId,SQL,Employee,id,刷题
From: https://www.cnblogs.com/JiurenShang/p/18009985

相关文章

  • MySQL存储引擎-InnoDB数据页
    MySQL存储引擎-InnoDB数据页MySQL一个数据页默认16kb,MySQL为了不同目的涉及了很多类型的数据页,如undo页、ChangeBuffer页等等。我们这里只关心存放数据的页,即索引(INDEX)页。一个数据页的存储空间大致被划分为7部分,分别为:1、FIleHeader 文件头 38字节2、PageHeader页面......
  • Ubuntu18.04定时备份MySQL、PostgreSQL数据库
    1、备份MySQL数据库脚本LOG_DATE=`date+'%Y-%m-%d%H:%M:%S'`LOG_PATH=/home/dbserver/script_data/backup.logecho"$LOG_DATE=======>开始备份以下mysql数据库:">>${LOG_PATH}DUMP=/usr/bin/mysqldumpOUT_DIR=/home/dbserver/backup/mysql_backupLINU......
  • ERROR 1044 (42000): Access denied for user 'root'@'%' to database 'mysql&
    转自https://www.cnblogs.com/jiangfeilong/p/10560754.html 关键要授予 WITHGRANTOPTION;#原因:修改数据库账号时删除了默认的localhostroot, 新建了%root 但没有赋予全部权限;解决方法:1.关闭数据库#mysqldstop2.在my.cnf里加入skip-grant-tables3.停止服务器......
  • CentOS安装配置MySQL详细教程
    CentOS安装配置MySQL详细教程一、卸载系统中自带的MariaDB#检查MariaDBrpm-qa|grepmariadb#卸载MariaDBrpm-e--nodepsmariadb-libs二、下载MySQL安装包下载地址https://downloads.mysql.com/archives/community/三、将MySQL压缩包上传至/opt目录四、解压MyS......
  • JavaScript 实现类似SQL 左联接式的对象数组合并
    在JavaScript中,你可以使用对象合并(Objectmerging)来模拟数据库的左联接操作。左联接操作会将两个对象的特定属性进行合并,类似于SQL中的LEFTJOIN操作。假设你有两个对象,每个对象代表一个表:consttable1=[{id:1,age:30},{id:3,age:25},];consttable2......
  • SpringBoot集成Flink-CDC 采集PostgreSQL变更数据发布到Kafka
    (之前写了一个flink-cdc同步数据的博客,发布在某N,最近代码开源了,直接复制过来了,懒得重新写了,将就着看下吧)最近做的一个项目,使用的是pg数据库,公司没有成熟的DCD组件,为了实现数据变更消息发布的功能,我使用SpringBoot集成Flink-CDC采集PostgreSQL变更数据发布到Kafka。 一、业务......
  • Hive:构建于 Hadoop 之上、让你像写 SQL 一样编写 MapReduce 程序
    Hive介绍本次我们来聊一聊Hive,它是由Facebook开源的一款基于Hadoop的数据仓库工具,用于解决海量结构化日志的数据统计与分析。Hive通过将结构化的数据映射为一张表,并提供类SQL查询功能,让开发人员能够编写SQL进行数据分析。在介绍Hadoop的时候我们说过,使用MapReduce......
  • navicat连接mysql服务遇到的问题
    问题现象及描述:navicat连接数据库提示:2003-Can'tconnecttoMySqlserveron'192.168.245.131',(unkownerror)问题可能出现的原因:1、数据库连接ip、端口、用户名、密码信息输入错误(数据库连接四要素)2、该用户不可远程连接3、linux防火墙未开放解决方式数据库连接ip问题:......
  • ksqltest
    第三方都是水电费是的 水电费水电费是的防守使用localsocket方式登录数据库[kingbase@node1~]$ksql-dtest-Usystem使用TCP/IP方式登录数据库[kingbase@node1~]$ksql-h192.168.40.111-p54321-dtest-Usystem使用连接串方式登录数据库[kingbase@n......
  • SQL数据库入门04:数据查询操作
      本文介绍基于MicrosoftSQLServer软件,实现数据库表中多种数据查询方法的具体操作。(数据库基础(四):数据查询)  系列文章中示例数据来源于《SQLServer实验指导(2005版)》一书。依据本系列文章的思想与对操作步骤、代码的详细解释,大家用自己手头的数据,可以将相关操作与分析过程......