注册
登录

您现在的位置是:首页 > 学无止境

找出最近的2个薪资问题

木木彡82 2010-09-30 09:04:00 360人围观
这两天在《SQL puzzles and answers》一书中看到这个‘找出最近的2个薪资问题’,此问题是一个非常典型的场景。在这里自己试着给出2个我一下能想到的解决方案,与大家分享(代码在SQL Server 2008下,测试通过)。值得一提的是原书中给出了9种解决方案,有兴趣的可以去看看。

转载自:http://www.cnblogs.com/DBFocus/archive/2010/09/23/1833375.html

这两天在《SQL puzzles and answers》一书中看到这个‘找出最近的2个薪资问题’,此问题是一个非常典型的场景。在这里自己试着给出2个我一下能想到的解决方案,与大家分享 (代码在SQL Server 2008下,测试通过)。值得一提的是原书中给出了9种解决方案,有兴趣的可以去看看。

问题描述

我们有一张Salaries表,其中记录了员工薪资变化的情况。创建Salaries表脚本如下(此脚本来自与原书):

其中emp_name为员工名,sal_date为调薪日期,sal_amt为调薪后的薪资。

现在的问题是要得到一个结果集,每一个员工一条记录。结果集包含5列,第1列为emp_name,第2列date1为此员工最近一次调薪的日期,第 3列sal1为此员工最近一次调薪后的薪资,第4列date2为此员工倒数第二次调薪的日期,第5列sal2为此员工倒数第二次调薪后的薪资。

对于上例期望得到的结果为:

emp_name date1 sal1 date2 sal2
Tom 1996-12-20 900.00 1996-10-20 800.00
Harry     1996-09-20 700.00 1996-07-20 500.00
Dick      1996-06-20 500.00 NULL NULL

解决方案1

此方案完全使用子查询完成。其中需要注意的是where条件中的or S2.sal_date is null子句,如果没有此条件就会丢失一条记录。

解决方案2

第二种方案使用到了ROW_NUMBER()分析函数,其中的聚合计算也是一个小技巧。

解决方案3

 

文章评论

  • 登录后评论

点击排行