http://post.baidu.com/f?kz=96648090 【1】
总结一下:
1. TOP N 的三种语义。
M1: 某种顺序下前N条记录,重复的也算做一条 top 3 1(10) 2(10) 3(10)
M2: 把所有排序列等于第N条的记录都计算进去,结果可能多余N条记录1(10) 1(10) 3(20) 3(20),但N之前的重复记录要重复计算。这个例子中TOP 3 和 TOP 4结果一样。
M3: 所有值相等的记录只算作前N个顺序中的一个位置,如 TOP 3 1(10) 1(10) 2(11) 2(11) 2(11) 3(20)
2. ORACLE,DB2,SQL SERVER 的新版本中都增加了OLAP函数 rank() dense_rank() row_number()
rank 名次(值) 1(10) 1(10) 3(20) 重复值的序号一样,但要空出位置M2
dense_rank 1(10) 1(10) 2(20) 重复的只占一个序号位置 M3
row_number() 1(10) 2(10) 3(20) 一条记录对应一个序号 M1
详细解释可以参考http://www.blogjava.net/pengpenglin/archive/2008/06/26/210839.html 例子容易理解
3. 另外
SQL SERVER 中 TOP N [ WITH TIES ] 参考【1】
DB2 中 FETCH FIRST N ROWS ONLY
ORACLE 中 rownum(查询结果出来时自然序号) rowid
ORACLE中rownum与row_number()区别:(参考别人)
row_number()和ROWNUM是看起来相似但概念完全不同的东西,
row_number()是一个分析函数(Analytic Function),它返回的是基于over()参数的行号。
rownum是oracle特别提供的一个伪列,它只作用于查询的结果集,根据结果集输出的先后次序给每个纪录顺次编号。
这样答案
select a.* from(select row_number() over(order by order_col) r,* from stb )a where a.r20;
如果不排序,用rownum top n fetch first 加上except应该也可以。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/38085/viewspace-1013225/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/38085/viewspace-1013225/