查找第N高的薪水

2024-03-28 14:18
文章标签 查找 薪水

本文主要是介绍查找第N高的薪水,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

思路1:单表查询

由于本题不存在分组排序,只需返回全局第N高的一个,所以自然想到的想法是用order by排序加limit限制得到。需要注意两个细节:

同薪同名且不跳级的问题,解决办法是用group by按薪水分组后再order by
排名第N高意味着要跳过N-1个薪水,由于无法直接用limit N-1,所以需先在函数开头处理N为N=N-1。
注:这里不能直接用limit N-1是因为limit和offset字段后面只接受正整数(意味着0、负数、小数都不行)或者单一变量(意味着不能用表达式),也就是说想取一条,limit 2-1、limit 1.1这类的写法都是报错的。
注:这种解法形式最为简洁直观,但仅适用于查询全局排名问题,如果要求各分组的每个第N名,则该方法不适用;而且也不能处理存在重复值的情况。

CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGINSET N := N-1;RETURN (# Write your MySQL query statement below.SELECT salaryFROM employeeGROUP BY salaryORDER BY salary DESCLIMIT N, 1);
END

思路2:子查询

排名第N的薪水意味着该表中存在N-1个比其更高的薪水
注意这里的N-1个更高的薪水是指去重后的N-1个,实际对应人数可能不止N-1个
最后返回的薪水也应该去重,因为可能不止一个薪水排名第N
由于对于每个薪水的where条件都要执行一遍子查询,注定其效率低下

CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGINRETURN (# Write your MySQL query statement below.SELECT DISTINCT e.salaryFROM employee eWHERE (SELECT count(DISTINCT salary) FROM employee WHERE salary>e.salary) = N-1);
END

这篇关于查找第N高的薪水的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/855838

相关文章

【Altium】查找PCB上未连接的网络

【更多软件使用问题请点击亿道电子官方网站】 1、文档目标: PCB设计后期检查中找出没有连接的网络 应用场景:PCB设计后期,需要检查是否所有网络都已连接布线。虽然未连接的网络会有飞线显示,但是由于布线后期整板布线密度较高,虚连,断连的网络用肉眼难以轻易发现。用DRC检查也可以找出未连接的网络,如果PCB中DRC问题较多,查找起来就不是很方便。使用PCB Filter面板来达成目的相比DRC

使用J-Link Commander查找STM32死机问题

接口:PA13,PA14,请勿连接复位引脚。 输入usb命令 这里我已经连接过了STM32F407VET6了。 再输入connect命令 这里我已经默认选择了SWD接口,4000K速率。 可以输入speed 4000命令选择4000K速率: 写一段崩溃代码进行测试: void CashCode(void){*((volatile uint32_t*) 0x080FFFFF)

二分查找(算法篇)

算法之二分查找 二分查找 概念: 针对于已经预先排序好的数据,每次将数据进行对半查找,然后看它中间的数据是否是要找的,如果是就返回中间位置,不是就判断该数据是在前半部分还是后半部,然后在进而取其中部,看其是否找到,然后如果还没找到就一直重复操作,直到找到为止,该算法时间复杂度为O(logn) 代码: int search(vector<int>& nums, int target) {i

SQL找出所有员工当前薪水salary情况

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 描述 有一个薪水表,salaries简况如下: 请你找出所有员工具体的薪水salary情况,对于相同的薪水只显示一次,并按照逆序显示,以上例子输出如下: 方法1:di

oracle创建一个带参数的存储过程:为指定的员工,涨100块钱的工资;并且打印涨前和涨后的薪水

--创建一个带参数的存储过程--为指定的员工,涨100块钱的工资;并且打印涨前和涨后的薪水/*beginraisesalary(6755);raisesalary(4456);commit();//这里提交,所以说我们一般不会在存储过程或者存储函数中写提交,end;/*/--host cls--先创建表emp和插入数据,显示表的结构用desc 表名--create table empcr

leetcode 二分查找·系统掌握 x的平方根

题目: 题解 这题可以使用~01~泛型查找在0~x/2的范围内查找答案。 int mySqrt(int x) {long l=0,r=x,mid;while(l<r){mid=(l+r+1)>>1;if(mid*mid>x)r=mid-1;else l=mid;}//因为一定有答案所以不用判定是否查找失败return l;}

leetcode 二分查找·系统掌握 第一个错误版本

题意: 题解: 就是经典的~01~泛型查找,而且一定存在这样错误的版本所以查找不会"失败",返回每次查找结果即可。 int firstBadVersion(int n) {long l=1,r=n,mid;while(l<r){mid=(l+r)>>1;if(isBadVersion(mid))r=mid;else l=mid+1;}return l;}

leetcode 二分查找·系统掌握 搜索二维矩阵

题目: 题解: 一个可行的思路是使用~01~泛型对每一行的最后一个元素进行查找找到第一个大于等于target的那一行,判断查找结果如果“失败”返回false否则继续在改行进行常规二分查找target的值根据查找结果返回即可。 bool searchMatrix(vector<vector<int>>& matrix, int target) {int l=0,r=matrix.size()-

微策略面试题:在旋转后的数组中查找元素(二分查找)

版权所有。所有权利保留。 欢迎转载,转载时请注明出处: http://blog.csdn.net/xiaofei_it/article/details/17123303 一个无重复元素的有序数组,经过若干次旋转后,得到一个新数组。比如[1,4,5,8,10,12,56,78]变成[12,56,78,1,4,5,8,10]。 现在要在这个数组中寻找元素。 其实算法很简单,就是用二分