[演算法][SQL]演算法挑战系列(3)-Nth Highest Salary

哈啰!我又来了,每週一篇文章应该是对我而言最舒服的频率了,好啦!那是题外话XD

话说上一个礼拜的SQL挑战出乎意料的出现很多高手,也在这里感谢大家愿意分享自己的解法,我也很开心可以在自己的文章下能有这样子的程式小交流,那今天的主题就继续来玩SQL吧!

题目名称:Nth Highest Salary
难易度:中
题目内容:将参数n传入FunctiongetNthHighestSalary(n),并回传Employee资料表中领第n高的薪水金额。
例如:
1.Employee资料表:

IdSalary110022003300getNthHighestSalary(2),将n以2带入函式,让函式回传Employee资料表中第2高的薪水金额,所以答案是200。

2.Employee资料表:

IdSalary11002100getNthHighestSalary(2),将n以2带入函式,让函式回传Employee资料表中,第2高的薪水金额,但是因为表中只有100一个薪额,没有所谓的第二高,所以得回传null。

好的,那接下来就开始吧!

/*建立一个能够传入参数 @N 的Function*/CREATE FUNCTION getNthHighestSalary(@N INT) RETURNS INT AS/*T-SQL的範围开始*/BEGIN    /*直接回传*/    RETURN (        /*用DISTINCT过滤掉相同金额的薪水*/        SELECT DISTINCT Salary        FROM Employee        /*将金额由大到小排列*/        ORDER BY Salary DESC        /*用分页语法取出略过 @N 笔资料后的第1笔资料        如果 @N 为1就要带出第一高,所以略过0(@N-1)笔资料        如果 @N 为2就要带出第二高,所以略过1(@N-1)笔资料*/        OFFSET (@N-1) ROWS FETCH NEXT 1 ROWS ONLY    );/*T-SQL的範围结束*/END

上面是我的个人解法XD,另外我在问题讨论区中有看到一个觉得还满特别的解法,和大家分享该网友解法:

/*建立一个能够传入参数 @N 的Function*/CREATE FUNCTION getNthHighestSalary(@N INT) RETURNS INT AS/*T-SQL的範围开始*/BEGIN    RETURN (        /*(3)最后再查出不重複的薪水,也就是第几名*/        SELECT DISTINCT salary         FROM   employee e1         /*(2)拿到排名后就可以直接和 @N 做比较,看哪一个排名符合条件*/        WHERE  @N =             /*(1)精华就在这个子查询了,他JOIN了外面层资料表的薪水,            并比较内层大于等于该薪水的数量有几个,            如果外面的薪水最高是300,那JOIN到内层资料表大于等于300的个数就一个,            如果外面的薪水第二高是200,那JOIN到内层资料表大于等于200的个数就两个,            所以经过子查询处理,其实就可以带出各金额的排名*/            (SELECT COUNT(DISTINCT salary)             FROM   employee e2             WHERE  e1.salary <= e2.salary)     );/*T-SQL的範围结束*/END

ㄛ,解读程式码真的就和翻译原文书一样困难,还请大家多多包涵http://img2.58codes.com/2024/emoticon06.gif,我尽量使用(1)(2)(3)的顺序讲解,如果有哪边搞错了还请各位大大留言告诉我http://img2.58codes.com/2024/emoticon41.gif

这次的题目就是属于T-SQL的应用了,但是因为不是很困难,所以还是可以直接在RETURN内写SQL语法来处理掉这一题http://img2.58codes.com/2024/emoticon07.gif,不过以后如果真的碰到T-SQL的题目就要开始爬文研究了,http://img2.58codes.com/2024/emoticon13.gif,另外提醒一下,上方的注解都是我在编辑文章的时候才打上去的,如果要直接贴到该网站去执行,要记得先把注解都拿掉,因为我提交执行只要有注解都会出错。

那欢迎大家如果有什么文章内问题,或是如果发现有什么也是很好用的演算法网站、题目,都可以在下方留言告知我,谢谢大家!http://img2.58codes.com/2024/emoticon41.gif


关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章