前言
好好学习,天天向上。
正文
好像也是一个不难的问题,刚视频里看到的,就记一下吧。
下面是表中原始的数据结构,做了一个倒叙排序:
select * from Employee order by Salary desc
首先来看一下如何取Salary第二的记录。
--获取salary排行第二的人的信息
select top 1 * from Employee where Salary < (select max(salary) from Employee ) order by Salary desc
原理是先获取到最大的salary-maxSalary,然后根据salary降序排序,取第一条salary小于该maxSalary的记录.
下面来看一下如何取Salary第三的记录
--获取salary排行第三的人的信息
select top 1 * from (
select top 3 * from Employee order by Salary desc
) as result
order by Salary asc
原理是先根据Salary降序排序获取到前3条记录,作为Result一个结果集
然后再在这个结果集里面用Salary升序排序,取第一条。
下面再来看一下使用ROW_NUMBER(顺道试验了Rank,Dense_Rank这两个函数)这个函数的写法:
--获取salary排行第三的人的信息
select * from (
select * ,row_number () over (order by salary desc) as RowNumber,RANK() over (order by salary desc) as RankNumber,DENSE_RANK() over (order by salary desc) as DenseRankNumber from Employee
) as Result
where Result.RowNumber =3
先看一下Result这个函数的结果集:
注意一下B和C的salary是一样的,但是得到的3个number值是不同的,项目中看具体情况,选择需要的函数。
我们这里取RowNumber.
结果也是一样的。
就到这里吧。