oracle分析函式系列之rank,dense_rank,row_number:實現排名策略
Row_number函式返回一個唯一的值,當碰到相同資料時,排名按照記錄集中記錄的順序依次遞增。
②DENSE_RANK:Dense_rank函式返回一個唯一的值,除非當碰到相同資料時,此時所有相同資料的排名都是一樣的。
③RANK:Rank函式返回一個唯一的值,除非遇到相同的資料時,此時所有相同資料的排名是一樣的,同時會在最後一條相同記錄和下一條不同記錄的排名之間空出排名。這樣的介紹有點難懂,我們還是通過例項來說明吧,下面的例子演示了
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
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
9 23 1224992 12 12 13
9 24 1224992 12 12 14
10 30 1216858 151315
30 rows selected.
請注意上面的綠色高亮部分,這裡生動的演示了3種不同的排名策略:①對於第一條相同的記錄,3種函式的排名都是一樣的:12
②當出現第二條相同的記錄時,Rank和Dense_rank依然給出同樣的排名12;而row_number則順延遞增為13,依次類推至第三條相同的記錄③當排名進行到下一條不同的記錄時,可以看到Rank函式在12和15之間空出了13,14的排名,因為這2個排名實際上已經被第二、三條相同的記錄佔了。而Dense_rank則順序遞增。row_number函式也是順序遞增比較上面3種不同的策略,我們在選擇的時候就要根據客戶的需求來定奪了:①假如客戶就只需要指定數目的記錄,那麼採用row_number是最簡單的,但有漏掉的記錄的危險②假如客戶需要所有達到排名水平的記錄,那麼採用rank或dense_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.
相關推薦
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