哈啰!我又来了,每週一篇文章应该是对我而言最舒服的频率了,好啦!那是题外话XD
话说上一个礼拜的SQL挑战出乎意料的出现很多高手,也在这里感谢大家愿意分享自己的解法,我也很开心可以在自己的文章下能有这样子的程式小交流,那今天的主题就继续来玩SQL吧!
题目名称:Nth Highest Salary
难易度:中
题目内容:将参数n传入FunctiongetNthHighestSalary(n)
,并回传Employee
资料表中领第n高的薪水金额。
例如:
1.Employee
资料表:
getNthHighestSalary(2)
,将n以2带入函式,让函式回传Employee
资料表中第2高的薪水金额,所以答案是200。2.Employee
资料表:
getNthHighestSalary(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
ㄛ,解读程式码真的就和翻译原文书一样困难,还请大家多多包涵,我尽量使用(1)(2)(3)的顺序讲解,如果有哪边搞错了还请各位大大留言告诉我
。
这次的题目就是属于T-SQL的应用了,但是因为不是很困难,所以还是可以直接在RETURN内写SQL语法来处理掉这一题,不过以后如果真的碰到T-SQL的题目就要开始爬文研究了,
,另外提醒一下,上方的注解都是我在编辑文章的时候才打上去的,如果要直接贴到该网站去执行,要记得先把注解都拿掉,因为我提交执行只要有注解都会出错。
那欢迎大家如果有什么文章内问题,或是如果发现有什么也是很好用的演算法网站、题目,都可以在下方留言告知我,谢谢大家!