Oracle筆記-分析函數

2021-01-11 至頂網

  第 12 章 分析函數

  12.1 分析函數如何工作

  語法

  FUNCTION_NAME(<參數>,…)

  OVER

  (<PARTITION BY 表達式,…> <ORDER BY 表達式 <ASC | DESC> <NULLS FIRST | NULLS LAST>> <WINDOWING子句>)

  PARTITION子句

  ORDER BY子句

  WINDOWING子句

  預設時相當於RANGE UNBOUNDED PRECEDING

  1. 值域窗(RANGE WINDOW)

  RANGE N PRECEDING

  僅對數值或日期類型有效,選定窗為排序後當前行之前,某列(即排序列)值大於/小於(當前行該列值 ?/+ N)的所有行,因此與ORDER BY子句有關係。

  2. 行窗(ROW WINDOW)

  ROWS N PRECEDING

  選定窗為當前行及之前N行。

  還可以加上BETWEEN AND 形式,例如RANGE BETWEEN m PRECEDING AND n FOLLOWING

  函數

  AVG(<distinct | all> expr)

  一組或選定窗中表達式的平均值

  CORR(expr, expr)

  即COVAR_POP(exp1,exp2) / (STDDEV_POP(expr1) * STDDEV_POP(expr2)),兩個表達式的互相關,-1(反相關) ~ 1(正相關),0表示不相關

  COUNT(<distinct> <*> <expr>)

  計數

  COVAR_POP(expr, expr)

  總體協方差

  COVAR_SAMP(expr, expr)

  樣本協方差

  CUME_DIST

  累積分布,即行在組中的相對位置,返回0 ~ 1

  DENSE_RANK

  行的相對排序(與ORDER BY搭配),相同的值具有一樣的序數(NULL計為相同),並不留空序數

  FIRST_VALUE

  一個組的第一個值

  LAG(expr, <offset>, <default>)

  訪問之前的行,OFFSET是預設為1 的正數,表示相對行數,DEFAULT是當超出選定窗範圍時的返回值(如第一行不存在之前行)

  LAST_VALUE

  一個組的最後一個值

  LEAD(expr, <offset>, <default>)

  訪問之後的行,OFFSET是預設為1 的正數,表示相對行數,DEFAULT是當超出選定窗範圍時的返回值(如最後行不存在之前行)

  MAXexpr)

  最大值

  MIN(expr)

  最小值

  NTILE(expr)

  按表達式的值和行在組中的位置編號,如表達式為4,則組分4份,分別為1 ~ 4的值,而不能等分則多出的部分在值最小的那組

  PERCENT_RANK

  類似CUME_DIST,1/(行的序數 - 1)

  RANK

  相對序數,允許並列,並空出隨後序號

  RATIO_TO_REPORT(expr)

  表達式值 / SUM(表達式值)

  REGR_ xxxx(expr, expr)

  線性回歸函數

  ROW_NUMBER

  排序的組中行的偏移

  STDDEV(expr)

  標準差

  STDDEV_POP(expr)

  總體標準差

  STDDEV_SAMP(expr)

  樣本標準差

  SUM(expr)

  合計

  VAR_POP(expr)

  總體方差

  VAR_SAMP(expr)

  樣本方差

  VARIANCE(expr)

  方差

  12.2 例子

  豎錶轉橫表

  一般形式為將一個列為C!, C2, … CN的表,以C1, C2, … CX為基準,將CX+1, … CN的不同值改為列。一般化的語法:

  SELECT C1, C2, … CX,

  MAX(DECODE(rn, 1, CX+1, NULL)) CX+1_1, … MAX(DECODE(rn, 1, CN, NULL)) CN_1

  MAX(DECODE(rn, 2, CX+1, NULL)) CX+1_2, … MAX(DECODE(rn, 2, CN, NULL)) CN_2

  …

  MAX(DECODE(rn,N,CX+1, NULL)) CX+1_N, … MAX(DECODE(rn,N, CN, NULL)) CN_N

FROM

(SELECT C1, C2, … CN,

ROW_NUMBER() OVER (PARTITION BY C1, C2, … CX ORDER BY <something>) rn

   FROM T

   WHERE …)

GROUP BY C1, C2, … CX;

通用包:

CREATE OR REPLACE PACKAGE pkg_pivot

AS

  TYPE refcursor IS REF CURSOR;

  TYPE ARRAY IS TABLE OF VARCHAR2(30);

  PROCEDURE pivot(p_max_cols IN NUMBER DEFAULT NULL,

                  p_max_cols_query IN VARCHAR2 DEFAULT NULL,

                  p_query IN VARCHAR2,

                  p_anchor IN ARRAY,

                  p_pivot IN ARRAY,

                  p_cursor IN OUT refcursor);

END;

CREATE OR REPLACE PACKAGE BODY pkg_pivot

AS

  PROCEDURE pivot(p_max_cols IN NUMBER DEFAULT NULL,

                  p_max_cols_query IN VARCHAR2 DEFAULT NULL,

                  p_query IN VARCHAR2,

                  p_anchor IN ARRAY,

                  p_pivot IN ARRAY,

                  p_cursor IN OUT refcursor)

  AS

    l_max_cols NUMBER;

    l_query LONG;

    l_cnames ARRAY;

  BEGIN

    IF (p_max_cols IS NOT NULL)

    THEN

      EXECUTE IMMEDIATE p_max_cols_query INTO l_max_cols;

    ELSE

      RAISE_APPLICATION_ERROR(-20001, 'Cannot figure out max cols');

    END IF;

    l_query := 'select ';

    FOR i IN 1 .. p_anchor.count

    LOOP

      l_query := l_query || p_anchor(i) || ',';

    END LOOP;

    FOR i IN 1 .. l_max_cols

    LOOP

      FOR j IN 1 .. p_pivot.count

      LOOP

        l_query := l_query || 'max(decode(rn,'||i||','||p_pivot(j)||',null)) '||p_pivot(j) || '_' || i || ',';

      END LOOP;

    END LOOP;

    l_query := RTRIM(l_query,',') || ' from (' || p_query || ') group by ';

    FOR i IN 1 .. p_anchor.count

    LOOP

      l_query := l_query || p_anchor(i) || ',';

    END LOOP;

    l_query := RTRIM(l_query,',');

    EXECUTE IMMEDIATE 'alter session set cursor_sharing=force';

    OPEN p_cursor FOR l_query;

    EXECUTE IMMEDIATE 'alter session set cursor_sharing=exact';

  END;

END;

  其中:

  p_max_cols_query為SELECT MAX(COUNT(*)) FROM TABLE_NAME GROUP BY C1, C2, … CX;

  p_query為SELECT C1, C2, … CN ROW_NUMBER() OVER (PARTITION BY C1, C2, … CX ORDER BY <something>) rn FROM TABLE_NAME;

  p_anchor為pkg_pivot.array(C1, C2, … CX)

  p_pivot為pkg_pivot.array(CX+1, CX+2, … CN)

  p_cursor為返回的遊標。

  12.3 最後說明

  PL/SQL與分析函數

  PL/SQL不支持分析函數的語法,可以通過以下兩種方法解決:

  1。使用動態遊標;

  2。將含分析函數的語句創建為視圖。

  WHERE子句中的分析函數

  由於查詢僅在最後的ORDER BY子句前執行分析函數,因此WHERE條件中無法使用分析函數,只能利用嵌套循環實現。

查看本文來源

相關焦點

  • 零基礎學Oracle之2:開始使用oracle
    零基礎學Oracle之2:開始使用oracle1、 資料庫管理工具OUI:安裝使用,自帶的DBCA:圖形化創建資料庫,初學者使用SQL*PLUS:重點掌握OEM:外圍產品2、 OUI:統一安裝器而oracle則力推java,把java虛擬機內嵌到oracle中。[oracle@wl database]$ ./runInstaller 在資料庫軟體目錄下執行這個安裝,類似於windows的setup
  • oracle 查詢昨天記錄專題及常見問題 - CSDN
    A:對於不同平臺,存在同樣的問題因為Oracle使用了標準C函數gethrtime參考:http://www.eygle.com/unix/Man.Page.Of.gethrtime.htm使用了該函數的代碼都會存在問題.
  • Oracle資料庫參數優化參考
    (中國軟體網訊)分析評價Oracle資料庫性能主要有資料庫吞吐量、資料庫用戶響應時間兩項指標。資料庫用戶響應時間又可以分為系統服務時間和用戶等待時間兩項,即:資料庫用戶響應時間=系統服務時間+用戶等待時間。
  • R相關與回歸學習筆記(三十五)——樣條函數變換、線性可加模型(一)
    m個節點的三次樣條函數需要n+4個參數, 因為每段需要4個參數, m+1段需要4m+4個參數, 而在個節點上連續、一階導數連續、二階導數連續構成三個約束條件, 所以參數個數為m+4個。自然樣條函數假定函數在最左邊一段和最右邊一段為線性函數, 這樣m個節點需要m+2個參數。
  • oracle 查詢 今天、昨天、本周、本月、本季度的所有記錄
    A:對於不同平臺,存在同樣的問題因為Oracle使用了標準C函數gethrtime參考:http://www.eygle.com/unix/Man.Page.Of.gethrtime.htm使用了該函數的代碼都會存在問題.
  • 零基礎學Oracle之4:理解oracle的啟動與關閉
    spfile.ora, 啟動instance3) 查找initSID.ora這個文件並啟動instance4) 使用預設pfile,也就是在敲命令時STARTUP PFILE = $ORACLE_HOME/dbs/initDBA1.ora,直接用指定的pfile啟動instance2、 oracle
  • oracle 函數decode用法
    ELSIF 條件=值n THENRETURN(翻譯值n)ELSERETURN(預設值)END IFDECODE的用法這裡主要說的就是decode的用法,在很多時候這個函數還是很有用的。需求:查詢出的數據,1表示男生,2表示女生select t.id,t.name,t.age,decode(t.sex, '1', '男生', '2', '女生', '其他') as sexfrom STUDENT2 t結果:2.decode比較大小說明:sign(value)函數會根據
  • Oracle 19C rac集群靜默安裝操作手冊v2.0 for centos7
    /tmp目錄大小至少:1GB2.安裝Grid Infrastracture所需空間:12GB3.安裝Oracle Database所需空間:7.3GB4.此外安裝過程中分析、收集、跟蹤文件所需空間:10GB5.建議總共至少100GB(此處不包含ASM或NFS的空間需求) 1.2.2.內存檢查1.內存大小:至少8GB2
  • 競品分析報告:有道雲筆記與印象筆記
    本文作者針對兩款產品——有道雲筆記和印象筆記,進行了對比分析,其中包括用戶分析、產品定位、互動設計、功能結構等方面,最後針對分析比較給出相關建議。本文選取產品定位同為辦公類應用,且知名度與活躍用戶量與有道雲筆記相當的印象筆記作為主要競品進行分析。作為一名產品初學者,我在本文中將試從主要競品的整體情況、用戶與產品定位、視覺設計、功能結構等層面進行分析,並重點討論創建筆記這一核心功能的產品交互特點。在文末,我將以提升用戶粘性、實現用戶增長為目標,提出四點改進建議。
  • DB2常用函數與Oracle比較
    【IT168 技術文章】     1、類型轉化函數:decimal, double, Integer, smallint,real,Hex(arg),    date, time,timestamp,char, varchar    常用舉例:    --轉化為字符串類型
  • 【乾貨】ORACLE-AWR報告分析
    因為關聯表太多的時候,資料庫並不會窮舉所有的執行計劃,這會消耗太多的時間,oracle怎麼知道這條數據是你要的,另一個就不是你要的呢,這是需要cpu來過濾的。內存:SQL語句和執行計劃都需要在內存保留一段時間,還有取到的數據,根據LRU算法也會儘量在內存中保留,在執行SQL語句過程中,各種表之間的連接,排序等操作也要佔用內存。
  • 零基礎學Oracle之6:Oracle數字字典和動態視圖的理解
    2、數字字典(DD)1)在執行數據定義語言(definition language,DDL)語句或有些數據操縱語言 (data manipulation language ,DML) 語句時會更新數據字典2)有幾個特點存儲在system表空間它是由sys擁有由oracle server自動維護。
  • 高中數學必修一:指數函數最全題型課堂筆記,只需掌握這5種題型
    函數一直是數學學習中的難點,從初中開始學習比較簡單的一次函數、反比例函數和二次函數。進入高中後,先是學習了函數的概念和基本性質,在這個學習過程中,因為太過抽象,不少學生也是備受打擊和煎熬。不過好在學完基本性質,又開始學習具體的函數了,這對部分學生來說可能會稍微輕鬆一點,畢竟具體函數更容易通過圖像來研究其性質。指數函數是高中學習的第一個基本初等函數,也是高考常考的一個函數,需要大家認真對待。本文和大家分享一份指數與指數函數的課堂筆記,筆記中整理了指數函數的5種常考題型,真正吃透這5類題型,考試也就變得很簡單了。
  • 複變函數、高等數學、經典物理、中級法語等怎麼學?如何做筆記?
    No.1、複變函數2017級 郭姝含複變函數一周沒有像數學物理那麼多課時,只有一節大課和一節習題課,而且都在周五。雖然複變函數只有五周,但是我們也不能因此輕視這門課。到現在為止我感覺講課的速度很快,課堂容量也很大,而且兩節課中間的間隔時間較長,還是要在課下花時間及時複習。
  • go 學習筆記之學習函數式編程前不要忘了函數基礎
    函數式編程的立足點和出發點是函數,複雜函數是基本函數經過一定組合規律形成的,所以描述複雜函數的過程就是如何拆解重組的過程.所以接下來我們一邊複習一邊學習函數的基本特點,為接下來理解函數式編程打下基礎,關於函數的基礎語言可參考 go 學習筆記之值得特別關注的基礎語法有哪些函數的基礎語法和高級特性下面以最基本四則運算為例,貫穿全文講解函數的基本語法和高級特性
  • 高中數學必修一:對數與對數函數最全題型課堂筆記,共7種題型
    初中階段已經學習過一次函數、反比例函數和二次函數等三種基本初等函數,高中階段又先後學習了指數函數、對數函數和冪函數三種基本初等函數。前面的文章分享了指數與指數函數的5種常見題型,本文和大家分享一下對數與對數函數的七種常見題型課堂筆記,供大家參考!
  • 產品分析|你的第二大腦——印象筆記
    本文將從以下幾個方面進行分析:用戶分析用戶調研優化方案報告總結01 用戶分析1.1 用戶畫像02 用戶調研問題列表2.1 調研目的本次用戶調研目的是針對印象筆記作為「知識管理」的使用情況,探尋用戶出現「信息囤積」的情況及其原因分析,力求尋找解決「囤積問題」的辦法,主要通過收集用戶反饋、問卷調查、語音深度訪談進行
  • ...之我見】新老名師暢談「筆記」重新喚起師生對筆記的記憶與再認識
    理學院吳從炘教授於上世紀60年代完成的「實變函數」和「泛函分析」教學筆記作為老一代哈工大人教學規格的典範被哈工大博物館收藏。吳從炘教授認為,自己之所以能夠寫出具有一定特色的講稿,是因為在大學期間就親身體驗過記筆記的妙處。
  • Python數據分析常用函數及參數詳解,可以留著以備不時之需
    利用Python進行數據分析最核心的庫就是Pandas,可以說,掌握了Pandas庫,Python數據分析就屬於中階水平了。在《》一文中我們介紹了Python進行數據分析全流程的幾個主要函數。但由於實際中的分析需求可能比較複雜,就要求對數據做更加複雜的處理。所以,我們有必要提前準備一些常用的函數,這些函數不用全部會,知道有這些函數,並做到在我們要實現數據處理邏輯時,知道有什麼函數可用就夠了。
  • 踩坑oracle dbms_job簡單使用
    用sql創建時必須顯示指定,系統會自己算(Pass:此處指oracle資料庫的系統時間,暗中觀察比實際時間要稍慢,引起原因多種多樣,一時說不清,所以不要大驚小怪即可= =)也就是sysdate,用job window創建時可以不指定,同樣都是默認用創建job的時間。重頭戲之時間設置。