1. 程式人生 > >oracle分析函式系列之rank,dense_rank,row_number:實現排名策略

oracle分析函式系列之rank,dense_rank,row_number:實現排名策略

RankDense_rankRow_number函式為每條記錄產生一個從1開始至N的自然數,N的值可能小於等於記錄的總數。這3個函式的唯一區別在於當碰到相同資料時的排名策略。ROW_NUMBER

Row_number函式返回一個唯一的值,當碰到相同資料時,排名按照記錄集中記錄的順序依次遞增。 

DENSE_RANKDense_rank函式返回一個唯一的值,除非當碰到相同資料時,此時所有相同資料的排名都是一樣的。 

RANKRank函式返回一個唯一的值,除非遇到相同的資料時,此時所有相同資料的排名是一樣的,同時會在最後一條相同記錄和下一條不同記錄的排名之間空出排名。這樣的介紹有點難懂,我們還是通過例項來說明吧,下面的例子演示了

3個不同函式在遇到相同資料時不同排名策略:

SQL> select region_id, customer_id, sum(customer_sales) total,
  2         rank() over(order by sum(customer_sales) desc) rank,
  3         dense_rank() over(order by sum(customer_sales) desc) dense_rank,
  4         row_number() over(order by sum(customer_sales) desc) row_number
  5

    from user_order
  6   group by region_id, customer_id;

 REGION_ID CUSTOMER_ID      TOTAL       RANK DENSE_RANK ROW_NUMBER
---------- ----------- ---------- ---------- ---------- ----------
            
         8          18                1253840         11         11         11
         5           2
                 1224992         12         12         12
         9          23                1224992         12         12         13
         9          24                1224992         12         12         14
        10          30               1216858         151315
    

30
 rows selected.

請注意上面的綠色高亮部分,這裡生動的演示了3種不同的排名策略:對於第一條相同的記錄,3種函式的排名都是一樣的:12

當出現第二條相同的記錄時,RankDense_rank依然給出同樣的排名12;而row_number則順延遞增為13,依次類推至第三條相同的記錄當排名進行到下一條不同的記錄時,可以看到Rank函式在1215之間空出了13,14的排名,因為這2個排名實際上已經被第二、三條相同的記錄佔了。而Dense_rank則順序遞增。row_number函式也是順序遞增比較上面3種不同的策略,我們在選擇的時候就要根據客戶的需求來定奪了:假如客戶就只需要指定數目的記錄,那麼採用row_number是最簡單的,但有漏掉的記錄的危險假如客戶需要所有達到排名水平的記錄,那麼採用rankdense_rank是不錯的選擇。至於選擇哪一種則看客戶的需要,選擇dense_rank或得到最大的記錄三、使用分析函式為記錄進行分組排名:上面的排名是按訂單總額來進行排列的,現在跟進一步:假如是為各個地區的訂單總額進行排名呢?這意味著又多了一次分組操作:對記錄按地區分組然後進行排名。幸虧也提供了這樣的支援,我們所要做的僅僅是在over函式中order by的前面增加一個分組子句:partition by region_id

SQL> select region_id, customer_id, 
               sum(customer_sales) total,
  2         rank() over(partition by region_id
                        order by sum(customer_sales) desc) rank,
  3         dense_rank() over(partition by region_id
                        order by sum(customer_sales) desc) dense_rank,
  4         row_number() over(partition by region_id
                        order by sum(customer_sales) desc) row_number

  5    from user_order
  6   group by region_id, customer_id;

 REGION_ID CUSTOMER_ID      TOTAL       RANK DENSE_RANK ROW_NUMBER
---------- ----------- ---------- ---------- ---------- ----------
         5           4                1878275          1          1          1
         5           2                1224992          2          2          2
         5           5                1169926          3          3          3
         6           6                1788836          1          1          1
         6           9                1208959          2          2          2
         6          10               1196748          3          3          3       
  

30
 rows selected.

現在我們看到的排名將是基於各個地區的,而非所有區域的了!Partition by 子句在排列函式中的作用是將一個結果集劃分成幾個部分,這樣排列函式就能夠應用於這各個子集。

相關推薦

oracle分析函式系列rank,dense_rank,row_number:實現排名策略

Rank,Dense_rank,Row_number函式為每條記錄產生一個從1開始至N的自然數,N的值可能小於等於記錄的總數。這3個函式的唯一區別在於當碰到相同資料時的排名策略。①ROW_NUMBER: Row_number函式返回一個唯一的值,當碰到相同資料時,排名按照

oracle分析函式系列sum(col1) over(partition by col2 order by col3):實現分組彙總或遞增彙總

語法:sum(col1) over(partition by col2 order by col3 )  準備資料:    DEPT_ID    ENAME          SAL 1 1000            A                     2500

oracle分析函式系列LAG和LEAD:取出同一欄位的前N行的資料和後N行的值

Lag和Lead函式可以在一次查詢中取出同一欄位的前N行的資料和後N行的值。這種操作可以使用對相同表的表連線來實現,不過使用LAG和LEAD有更高的效率。以下是LAG和LEAD的例子: SQL> select  year,region,profit ,lag (pr

Oracle 的開窗函數 rank,dense_rank,row_number

rac 區別 str 分數 cells 函數 init color min 1、開窗函數和分組函數的區別 分組函數是指按照某列或者某些列分組後進行某種計算,比如計數,求和等聚合函數進行計算。 開窗函數是指基於某列或某些列讓數據有序,數據行數和原始數據數相同,依然能曾現個體數

Oracle 的開窗函式 rank,dense_rank,row_number

1、開窗函式和分組函式的區別 分組函式是指按照某列或者某些列分組後進行某種計算,比如計數,求和等聚合函式進行計算。 開窗函式是指基於某列或某些列讓資料有序,資料行數和原始資料數相同,依然能曾現個體資料的原貌。 事例資料 create table student_scores( stu_id varch

Oracle 分析函式row_number() over (partition by order by )

1、格式 row_number() over(partition by 列名1 order by 列名2 desc) 2、解析 表示根據 列名1 分組,然後在分組內部根據 列名2 排序,而此函式計算的值就表示每組內部排序後的順序編號,可以用於去重複值 與r

oracle 分析函式 over 用法

select * from test 資料: A B C 1 1 1 1 2 2 1 3 3 2 2 5 3 4 6 ---將B列值相同的對應的C 列值加總 select a,b,c, SUM(C) OVER (PARTITION BY B) C_Sum from test A B C C_SUM

oracle分析函式row_number的例項應用

row_number() over (partition by col1 order by col2) 表示根據col1分組,在分組內部根據 col2排序而這個值就表示每組內部排序後的順序編號(組內連續的唯一的) 表內容如下:name | seqno | descript

oracle分析函式row_number() over()使用(2)

row_number() over ([partition by col1] order by col2) ) as 別名表示根據col1分組,在分組內部根據 col2排序而這個“別名”的值就表示每組內部排序後的順序編號(組內連續的唯一的),[partition by col1] 可省略。 以Scott/ti

Oracle分析函式-nulls first/nulls last

select * from criss_sales; 通過rank()、dense_rank()、row_number()對記錄進行全排列、分組排列取值 但有時候,會遇到空值的情況,空值會影響得到的結果的正確性,如下所查。 select dept_id

oracle------分析函式和開窗函式over( )

一  什麼是分析函式   1  概念   分析函式是Oracle專門用於解決複雜報表統計需求的功能強大的函式,它可以在資料中進行分組然後計算基於組的某種統計值,並且每一組的每一行都可以返回一個統計值

Oracle分析函式-first_value()和last_value()

first_value()和last_value()字面意思已經很直觀了,取首尾記錄值。 例:查詢部門最早發生銷售記錄日期和最近發生的銷售記錄日期 select dept_id ,sale_date ,goods_type

[Oracle] 分析函式(2)- 開窗(WINDOWING)

SELECT emp_id,ename,dept_id,hire_date,sal, -- 以下均為首先按dept_id進行分組,其次按照hire_date進行排序,且所有統計不能跨越其所在分割槽,故不再重複 -- 視窗範圍為該分割槽的第一行到該分割槽的最後一行,與sum_sal_part等同 SUM

[Oracle] 分析函式(1)- 語法

語法概述 Analytic-Function Analytic_Clause之PARTITION子句 Analytic_Clause之ORDER BY子句 Analytic_Clause之WINDOWING子句 舉例: 下面看一個例子簡單過下語法: 例:

oracle分析函式彙總

一、分析函式語法function_name(<argument>,<argument>...) over(<partition_Clause><order by_Clause><windowing_Clause>);

筆記:oracle分析函式over

     select *     from (select d.*,                 rank() over(partition by group_id order by create_time desc) mm            from detail

Oracle分析函式五——統計分析函式

原創於2009年08月02日,2009年10月22日遷移至此。 Oracle 分析函式——統計分析函式 方差和標準差: 樣本中各資料與樣本平均數的差的平方和的平均數叫做樣本方差;樣本方差的算術平方根叫做樣本標準差。樣本方差和樣本標準差都是衡量一個樣本波動大小

Oracle分析函式

基本語法:     函式名稱([引數, ...])over(             partition by 子句 欄位, ...             [order by 子句 欄位, ...[asc|desc][nulls first|nulls last]]   

oracle 分析函式、GROUPING函式

分析函式 over(Partition by...) 一個超級牛皮的ORACLE特有函式。 天天都用ORACLE,用了快2年了。最近才接觸到這個功能強大而靈活的函式。真實慚愧啊! oracle的分析函式over 及開窗函式 一:分析函式over Oracle從8.1.6開始提供分析函式

一個SQL語句分清楚RANK(),DENSE_RANK(),ROW_NUMBER()三個排序的不同

在SCOTT使用者下,執行下面SQL; SELECT  s.deptno,s.ename,s.sal,RANK() over(partition by s.deptno order by s.sal) as rank,DENSE_RANK() over(partition