oracle 分析函數


Oracle-分析函數之連續求和        sum(…) over(…)
Oracle-分析函數之排序值          rank()和dense_rank()
Oracle-分析函數之排序后順序號     row_number()
Oracle-分析函數之取上下行數據     lag()和lead()

分析函數和聚合函數的區別

普通的聚合函數用group by分組,每個分組返回一個統計值,
 分析函數采用partition by分組,並且每組每行都可以返回一個統計值。


分析函數帶有一個開窗函數over(),包含三個分析子句:
1分組(partition by)
2排序(order by)
3窗口(rows)

規則

sum(…) over( ),對所有行求和
sum(…) over( order by … ), 連續求和
sum(…) over( partition by… ),同組內所行求和
sum(…) over( partition by… order by … ),同第1點中的排序求和原理,只是范圍限制在組內

select * from t1;

select sales_id, sales, dest, dept, revenue, sum(revenue) over() sum_order from test;

 

select sales_id, sales, dest, dept, revenue, sum(revenue) over(order by revenue) sum_order from test;

 select sales_id, sales, dest, dept, revenue, sum(revenue) over(partition by  sales_id) sum_order from test;

select sales_id, sales, dest, dept, revenue, sum(revenue) over(partition by  sales_id order by revenue) sum_order from test;

聚合函數RANK 和 dense_rank

【語法】 rank() over( [query_partition_clause] order_by_clause )

               dense_rank() over( [query_partition_clause] order_by_clause )

【功能】聚合函數RANK 和 dense_rank 主要的功能是計算一組數值中的排序值。

【參數】dense_rank與rank()用法相當

【區別】dence_rank在並列關系是,相關等級不會跳過。rank則跳過.

rank()是跳躍排序,有兩個第二名時接下來就是第四名(同樣是在各個分組內)
dense_rank()l是連續排序,有兩個第二名時仍然跟着第三名。

rank() 函數

SELECT a.col1,a.col2,RANK() OVER(PARTITION BY col2 ORDER BY col1) "Rank" FROM xgj a;

select * from xgj_2;

select *  from (select rank() over(partition by a.subject order by a.score desc) rk,   a.*   from xgj_2 a) t  where t.rk <= 3;

合計功能:計算出數值(65,’語文’)在Order By score ,subject排序下的排序值,也就是score=65,subject=語文在排序以后的位置

SELECT RANK(65, '語文') WITHIN GROUP(ORDER BY score, subject) "Rank"  FROM xgj_2;

 

dense_rank()

   與rank()用法相當,但是有一個區別:dence_rank在並列關系是,相關等級不會跳過。rank則跳過. 

 

ROW_NUMBER() OVER (PARTITION BY COL1 ORDER BY COL2)

功能】表示根據COL1分組,在分組內部根據 COL2排序,而這個值就表示每組內部排序后的順序編號(組內連續的唯一的)
row_number() 返回的主要是“行”的信息,並沒有排名.

【參數】

【說明】Oracle分析函數

【主要功能】:用於取前幾名,或者最后幾名等

SELECT a.col1,a.col2,row_number() OVER(PARTITION BY col2 ORDER BY col1) "Ra" FROM xgj a;

 

lag()和lead()

這兩個函數是偏移量函數,可以查出一個字段的上一個值或者下一個值,配合over來使用。

Lag和Lead分析函數可以在同一次查詢中取出同一字段的前N行的數據(Lag)和后N行的數據(Lead)作為獨立的列。

功能】表示根據COL1分組,在分組內部根據 COL2排序,而這個值就表示每組內部排序后的順序編號(組內連續的唯一的)

lead () 下一個值 lag() 上一個值

【參數】
EXPR是從其他行返回的表達式
OFFSET是缺省為1 的正數,表示相對行數。希望檢索的當前行分區的偏移量
DEFAULT是在OFFSET表示的數目超出了分組的范圍時返回的值。

exp_str 是要做對比的字段
offset 是exp_str字段的偏移量 比如說 offset 為2 則 拿exp_str的第一行和第三行對比,第二行和第四行,依次類推,offset的默認值為1!

select a.caseid,
       a.stepid as currentStepID,
       a.actiondate as currentActionDate,
       lag(stepid)          over(partition by a.caseid order by a.stepid) preStep,
       lag(actiondate)   over(partition by a.caseid order by a.stepid) preActionDate,
       lead(stepid)        over(partition by a.caseid order by a.stepid) nextStep,
       lead(actiondate)  over(partition by a.caseid order by a.stepid) nextActionDate
  from lead_table a;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM