TOP N 查询 SQL

最近笔试遇到好几次查询数据库表中第21-30条记录的题目,以前曾经关注过类似的例子 ,大都忘了。从网上找了相关知识,记录备忘.[@more@]

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/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值