记一个常见的ms sql server中取第N条记录的方法

前言

好好学习,天天向上。

正文

好像也是一个不难的问题,刚视频里看到的,就记一下吧。

下面是表中原始的数据结构,做了一个倒叙排序:

select * from Employee order by Salary desc

微信截图_20170208165800

首先来看一下如何取Salary第二的记录。

--获取salary排行第二的人的信息
select top 1 * from Employee where Salary < (select max(salary) from Employee ) order by Salary desc

微信截图_20170208170928

原理是先获取到最大的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一个结果集

微信截图_20170208171031

然后再在这个结果集里面用Salary升序排序,取第一条。

微信截图_20170208171001

下面再来看一下使用ROW_NUMBER(顺道试验了RankDense_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这个函数的结果集:

微信截图_20170208172508

注意一下B和C的salary是一样的,但是得到的3个number值是不同的,项目中看具体情况,选择需要的函数。

我们这里取RowNumber.

微信截图_20170208171001

结果也是一样的。

就到这里吧。

posted @ 2017-02-08 17:43  Sheldon_Lou  阅读(936)  评论(1编辑  收藏  举报