TOP N 查詢 SQL

exocet發表於2008-11-11
最近筆試遇到好幾次查詢資料庫表中第21-30條記錄的題目,以前曾經關注過類似的例子 ,大都忘了。從網上找了相關知識,記錄備忘.[@more@]

【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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章