oracle 分析函數和開窗函數


有一個需求,將查詢出的數據按照地區分組,隨機取出每個區域的2條數據,這里用到了oracle的開窗函數:

最終寫出的sql如下:

select * from (select region,row_number() over(partition by region order by DBMS_RANDOM.random) rn from T_PROCURE_REVIEW_EXPERT) where rn < 3

下面說下over(),partition by這些函數的意思:

什么是分析函數(partition by):

分析函數是Oracle專門用於解決復雜報表統計需求的函數,它可以在數據中進行分組,然后計算基於組的某種統計值,並且每一組的每一行都可以返回一個統計值。

普通的聚合函數用group by分組,每個分組返回一個統計值,只有一行,而分析函數采用partition by分組,每組中包含多個值。

關於開窗函數(over()):

開窗函數指定了分析函數中的分組的大小。

分析函數帶有一個開窗函數over(),包含三個分析子句:分組(partition by), 排序(order by), 窗口(rows) ,這些就是窗口的規則。他們的使用形式如下:over(partition by xxx order by yyy rows between zzz)。

注意:窗口子句不能單獨出現,必須有order by子句時才能出現。

 

 

聚合函數,分析函數和開窗函數結合使用的例子:

取出每月通話費最高和最低的兩個地區:(例子原文:https://blog.csdn.net/haiross/article/details/15336313 來自:CSDN

select bill_month, area_code,sum(local_fare) local_fare,

  first_value(area_code) over(partition by bill_month  order by sum(local_fare) desc

    rows between unbounded preceding and unbounded following) firstval, --按月分組,並統計該月的總和,取第一個 rows后面這一行代表查找的范圍。

  last_value(area_code) over(partition by bill_month  order by sum(local_fare) desc

    rows between unbounded preceding and unbounded following) lastval

from t

group by bill_month, area_code

order by bill_month

 

注:first_value()和last_value():在分析函數中使用,取首尾記錄值

注:unbounded preceding and unbouned following針對當前所有記錄的前一條、后一條記錄,也就是表中的所有記錄

(unbounded:不受控制的,無限的 preceding:在...之前 following:在...之后)

 

這里自己做了些數據,在數據庫中測試一下:

分析:先按照 bill_month和area_code分組:

select bill_month, 
  area_code,
  sum(local_fare) local_fare 
from t 
group by bill_month, area_code 
order by bill_month

得到結果如下:

然后用分析函數得到最大和最小值

 


免責聲明!

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



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