oracle分組排序取前幾

2021-10-09 09:35:51 字數 1602 閱讀 4307

專案需求:分組排序

1、要求取出按field1分組後,並在每組中按照field2排序;

2、根據要求取出1中已經分組排序好的前多少行的資料;

row_number()over(partition by col1 order by col2)表示根據col1分組,再分組內部根據col2排序,而此函式計算的值就表示每組內部排序後的順序編號(組內連續的唯一的)。 (1,2,3,4,5.....)

rank()是跳躍排序,有兩個第二名時接下來就是第四名(同樣是在各個分組內)(1,2,2,4,5...)

dense_rank()也是連續排序,有兩個第二名時仍然跟著第三名。相比之下row_number是沒有重複值的。(1,2,2,3,4,5....)

示例sql**:   

createdate accno money

2014/6/5 111 200 

2014/6/4 111 600 

2014/6/5 111 400 

2014/6/6 111 300 

2014/6/6 222 200 

2014/6/5 222 800 

2014/6/6 222 500 

2014/6/7 222 100 

2014/6/6 333 800 

2014/6/7 333 500 

2014/6/8 333 200 

2014/6/9 333 0 

1、select t.*,row_number()over(partition by accno order by createdate) row_number from test t 

查詢結果如下:(即使某排序的字段的值相同,各組的row_number唯一)

2、 select t.*,rank()over(partition by accno order by createdate) rank from test t 

查詢結果(根據 createdate排序,在1、2組中,日期都相同,因此row_number一致。接下來的是4)

3、select t.*,dense_rank()over(partition by accno order by createdate) dense_rank from test t 

查詢結果:(重複的row_number之後依然是row_number+1)

第二個需求: 分組排序後分別取出各組內前多少的資料記錄,如班級裡有多個小組,求每組的前三名。

select createdate,accno,money,row_number from (select t.*,row_number() over(partition by accno order by createdate) row_number from test t) t1 where row_number<4

查詢結果如下:

如果是按照多個字段分組,那麼也是一樣的。多條件分組,多條件排序。

row_number()over(partition by a,b,c order by a,b,c)

Oracle分組取前三

oracle分組取前三 row number over函式的基本用法 語法 row number over partition by column order by column 從1開始,為每一條分組記錄返回乙個數字,相當於row num一樣的東西,之後再取最小的幾個 order by是先把列進行...

oracle分組取前5條資料

語句如下 select from select t.row number over partition by 分組字段 order by 排序字段 rn from 表名字 t where rn 6 示例 select from select t.row number over partition b...

elasticsearch分組排序取top N

比如有一張聯絡歷史表,裡面有使用者uid,號number,使用者所屬國家country,通話時長talktime幾個主要字段。現在的需求是要獲取平均通話時長最長的top 20個國家。先過濾掉一些不需要的資料,然後根據country分桶,在桶內求平均通話時長。最後根據每個桶的平均通話時長取top 20...