m1:使用oracle偽列rownum
select
rownum
rank,ord_col,... from (select
ord_col,... from
taborder by
ord_col desc
) where
rownum
< n
;這裡使用subquery是因為rownum在order by前求值。而對於top-n的乙個變形,求順序在m和n之間(m
m1(1):
select *from (select rownum
rank,ord_col,... from (select
ord_col,... from
taborder by
ord_col
desc) whererownum
<
n) where rank> m;
m1(2):
(select
rownum
rank,ord_col,... from (select
ord_col,... from
taborder by
ord_col desc
) where
rownum
< n)
minus
(select * from (select rownum
rank,ord_col,... from
taborder by
ord_col) where ord_col
m2:使用oracle rank()和dense_rank()函式:
rank ( ) over ( [query_partition_clause] order_by_clause )
dense_rank(expr[,expr]...) within group
(order by
expr [desc | asc] [nulls ]
[,expr [desc | asc] [nulls ]]...)
select
rank() over (order
by ord_col desc) rank from tab where
rownum
< n;
m2幾種變體:
簡單變體m2(1):
select * from (select
rank() over (order
by ord_coldesc) rank from tab) whererank < n;
m2(2):m-n
select * from (select
rank() over (order
by ord_col desc) rank from tab where rownum < n) whererank> m;
或select * from (select rank() over (order by ord_col desc) rank from tab ) whererankbetween nand m;
m2(3):partition by提供求分組top-n功能
select * from (select rank() over (partition by group_col order by ord_col desc) rank from tab ) whererank< n;
m2(4):dense_rank緊密排列,比如:1 1 2 3 3 4而不是rank的:1 1 3 4 4 6
select * from (select
dense_rank() over (order by ord_col desc) rank from tab) whererank < n;
m2(5):求top n%問題
select *from (select ord_col,rank() over (order byord_col desc) rank from tab) whererank < n%*(select count(1)from tab)
這些求
top-n的方法中,應該有一些效率的差別,一般來說用m2效率要較m1高一些,各個變體方法的效率應該差別不大,具體問題具體分析,也許還有更好的求
top-n的查詢方法,歡迎交流。
OBIEE中的TOPN分析
topn的意思 在某個系統中,有時候需要根據一定的規則對資料進行排序,並從排序列表中選取出最大或最小的n個資料,這就是乙個top n演算法。實現方式 但是在利用topn進行分析時會存在很多細節問題,例如 如果有重複的資料怎麼處理呢?首先,對沒有重複的資料進行topn分析 該部分的實現是比較簡單的。在...
mysql中TopN的實現
要實現topn,必定需要將資料進行分組,再將每個分組裡邊的資料進行排序。其實這個用order by a,b 就能夠對a欄位進行分組,再對b進行排序。排完序之後只需要將前n個就可以了。就像這樣,我們只需要把他們進行排序即可,我們可以建立兩個字段,第乙個字段記錄上乙個subject,第二個字段用來標記當...
求LOG檔案中的TOP N
搜尋引擎會通過日誌檔案把使用者每次檢索使用的所有檢索串都記錄下來,每個查詢串的長度為1 255位元組。假設目前有一千萬個記錄,這些查詢串的重複度比較 高,雖然總數是1千萬,但如果除去重複後,不超過3百萬個。乙個查詢串的重複度越高,說明查詢它的使用者越多,也就是越熱門。請你統計最熱門的10個查詢 串,...