[演算法][SQL]演算法挑战系列(4)-Department Top Three Salaries

ㄛ,其实我本来想在这礼拜回归JavaScript的,但是没有想到他一般等级的题目就有些难度了,其实也是因为这礼拜没有时间好好準备文章,真的很抱歉http://img2.58codes.com/2024/emoticon16.gif,不过我本来想说每五週就来一个等级Hard的题目,现在就把它提前一週吧!希望各位大大可以感受到我的诚意,然后我也不晓得他的题目难易度是怎么做判断的,可能我的SQL没有很好,所以看什么都差不多XD.那这一次的题目和前两题的解法都有相关,我也有从之前各位的留言分享中学到几招,所以可以找看看有没有熟悉的写法XD,那以下正文:

题目名称:Department Top Three Salaries
难易度:高
题目内容:取出每个部门中领最高薪水的前三名员工,并依金额由大到小排序。
例如:
Employee表内容:

IdNameSalaryDepartmentId1Joe7000012Henry8000023Sam6000024Max9000015Janet6900016Randy850001Department表内容:IdName--------------------------1IT2Sales查询结果:DepartmentEmployeeSalary---------------------------------------ITMax90000ITRandy85000ITJoe70000SalesHenry80000SalesSam60000这次附上建立资料表及资料的SQL(用MSSQL语法,无法用再麻烦告诉我):
Create table Employee (Id int, Name varchar(255), Salary int, DepartmentId int)Create table Department (Id int, Name varchar(255))insert into Employee (Id, Name, Salary, DepartmentId) values ('1', 'Joe', '70000', '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 Department (Id, Name) values ('1', 'IT')insert into Department (Id, Name) values ('2', 'Sales')

那以下是我的解法:

/*SELECT题目要的栏位*/SELECT d.Name Department,Employee,SalaryFROM/*先在内部做一个子查询,主要是为了帮各部门的员工薪水做排名*/(SELECT Name Employee,Salary,DepartmentId/*这里用DENSE_RANK()做排名 OVER()内PARTITION BY指定的栏位是群组 ORDER BY是以薪水排序*/,DENSE_RANK() OVER (PARTITION BY e.DepartmentId ORDER BY e.Salary DESC) AS SRankFROM Employee e) e/*JOIN部门档,带出部门名称*/LEFT JOIN Department d ON e.DepartmentId = d.Id/*查询条件是名次在前三名,以及在公司部门内的人员(因为我在解题的时候有些员工会是部门档没有的部门Id)*/WHERE SRank<=3 AND d.Name IS NOT NULL

其实如果刚好有解过前面两篇文章(或是对其他高手来说XD),这一题的难度其实没有算很高,我也不是有意要循序渐进和挑相同主题,只是就一个刚好三题的类型都差不多,将来会在提供其他不同类型的题目,让大家和我不要再做排名了,哈哈哈,那老样子如果以上文章有我没有注意到的地方,或是各位有其他解法,都欢迎在底下留言分享和告诉我,如果有问题我会立马修改!谢谢大家!

啊啊再让我PS一下,下礼拜我一定会回归JacaScript的,不过一般程式的题目对我来说真的太烧脑,所以小的还是会和SQL的题目交错分享http://img2.58codes.com/2024/emoticon41.gif


关于作者: 网站小编

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

热门文章