上次在网上看到一道sql考题:一张表有一个id字段,是integer类型的,然后要你找出id第2大的记录。

我闲来无事就动手写了写。后来终于发现一个比较简洁的t-sql写法。

  1. select * from (select row_number() over(order by id desc) as seq,* from t_scrap ) t where seq = 2 

这里主要用到了一个sql server里的一个新的函数 row_number()。其实你可以求出任意第N大的记录,当然也可以是第N小的记录,只需要把排序方式改变下就ok了。

而oracle里的写法

2011-03-04,适逢学习oracle,特增加:

  1. select * from t_scrap s where 1=(select count(*) from t_scrap where id > s.id) 

很不幸,不是我以前想的用sequence来实现的。解释:从t_scrap表里取一条记录,然后找出id比该记录id大的记录数。

如果比他大的只有1个(苛刻的条件直接导致了下面的缺陷),那么该记录就是第二大的。

不过上面两个写法都有一个缺陷,当存在并列第几的情形时,可能查不出任何数据。下面是我的一个解决方案:既然是有重复,那么我们可以把重复的用distinct关键字过滤掉,剩下的就是没有重复的数据了,在这个基础上再应用上面的解法就ok了。看完oracle的写法,那么下面的那个总结就不对了。。。只能说那是在t-sql里的一个解题思路。

总之,这个问题的解题思路是先对数据排序,然后无非是对排序好的记录加一个序号,并从中选出对应我们要的那个序号的记录。