1. 程式人生 > >ORACLE中的自定義聚合函式(User-Defined Aggregate Functions)

ORACLE中的自定義聚合函式(User-Defined Aggregate Functions)

聚合函式也叫分組函式,是對多行進行計算的一種函式,比如SUM、COUNT、AVG、MAX、MIN等等。

Oracle中為了增強擴充套件性,提供了一個自定義聚合函式的介面,ODCIAggregate(),使用者可以用Oracle支援的各類程式語言(PLSQL、C、C++、JAVA等)定義一個聚合函式,並在程式中按照一樣的語法進行使用。

實際應用中,使用到自定義聚合函式的場景極少,理由是:

1.PLSQL語言已經足夠豐富,可以輕鬆實現絕大部分聚合場景;

2.自定義聚合函式的效率不見得比直接PLSQL實現更高。

比如ITPUB上有個求加權中位數的帖子,答主給出了兩種方案的比較,實際上自定義聚合函式只是對PLSQL實現的一個包裝,詳細可以參考原文 

http://www.itpub.net/forum.php?mod=viewthread&tid=1377770

那麼,自定義聚合函式到底有啥用呢?個人覺得只有一個:封裝的需要,有時是為了改善程式碼可讀性,有時是基於技術細節的保密。

下面把Oracle官方文件的一個自定義聚合案例記錄一下,該案例中的函式SecondMax()是取第二大的數,實際上用分析函式分分鐘就可以解決,這不是一個恰當的使用場景,但可以解釋作為描述自定義聚合函式建立過程的樣例。

  1. 定義一個包含ODCIAggregate例程的物件型別SecondMaxImpl:

    create type SecondMaxImpl as object
    (
      max NUMBER,          -- highest value seen so far 
      secmax NUMBER,       -- second highest value seen so far
      static function ODCIAggregateInitialize(sctx IN OUT SecondMaxImpl) 
        return number,
      member function ODCIAggregateIterate(self IN OUT SecondMaxImpl, 
        value IN number) return number,
      member function ODCIAggregateTerminate(self IN SecondMaxImpl, 
        returnValue OUT number, flags IN number) return number,
      member function ODCIAggregateMerge(self IN OUT SecondMaxImpl, 
        ctx2 IN SecondMaxImpl) return number
    );
    /
    
  2. SecondMaxImpl型別具體實現:

    create or replace type body SecondMaxImpl is 
    static function ODCIAggregateInitialize(sctx IN OUT SecondMaxImpl) 
    return number is 
    begin
      sctx := SecondMaxImpl(0, 0);
      return ODCIConst.Success;
    end;
    
    member function ODCIAggregateIterate(self IN OUT SecondMaxImpl, value IN number) return number is
    begin
      if value > self.max then
        self.secmax := self.max;
        self.max := value;
      elsif value > self.secmax then
        self.secmax := value;
      end if;
      return ODCIConst.Success;
    end;
    
    member function ODCIAggregateTerminate(self IN SecondMaxImpl, 
        returnValue OUT number, flags IN number) return number is
    begin
      returnValue := self.secmax;
      return ODCIConst.Success;
    end;
    
    member function ODCIAggregateMerge(self IN OUT SecondMaxImpl, ctx2 IN SecondMaxImpl) return number is
    begin
      if ctx2.max > self.max then
        if ctx2.secmax > self.secmax then 
          self.secmax := ctx2.secmax;
        else
          self.secmax := self.max;
        end if;
        self.max := ctx2.max;
      elsif ctx2.max > self.secmax then
        self.secmax := ctx2.max;
      end if;
      return ODCIConst.Success;
    end;
    end;
    /
    
  3. 建立使用者自定義聚合函式SecondMax:

    CREATE FUNCTION SecondMax (input NUMBER) RETURN NUMBER 
    PARALLEL_ENABLE AGGREGATE USING SecondMaxImpl;
    
  4. 在sql語句中應用自定義聚合函式:

    SELECT SecondMax(salary), department_id
       FROM MyEmployees
       GROUP BY department_id
       HAVING SecondMax(salary) > 9000;

相關推薦

ORACLE定義聚合函式User-Defined Aggregate Functions

聚合函式也叫分組函式,是對多行進行計算的一種函式,比如SUM、COUNT、AVG、MAX、MIN等等。Oracle中為了增強擴充套件性,提供了一個自定義聚合函式的介面,ODCIAggregate(),使用者可以用Oracle支援的各類程式語言(PLSQL、C、C++、JAVA

Hive通用型定義聚合函式UDAF

計算器必須實現的方法: 1、getNewAggregationBuffer():返回儲存臨時聚合結果的AggregationBuffer物件。 2、reset(AggregationBuffer agg):重置聚合結果物件,以支援mapper和reducer的重用。 3、iterate(Aggregati

Oracle 定義聚合函式

create or replace type str_concat_type as object ( cat_string varchar2(4000), static function ODCIAggregateInitialize(cs_ctx In Out str_concat_

SQL SERVER使用者定義標量函式scalar user defined function的效能問題

使用者定義函式(UDF)分類       SQL SERVER中的使用者定義函式(User Defined Functions 簡稱UDF)分為標量函式(Scalar-Valued Function)和表值函式(Table-Valued Function)。其中表值函式又分為Inline table-val

SparkSQL建立RDD:UDAFUserDefinedAggregatedFunction使用者定義聚合函式【Java版純程式碼】

要實現8個方法,8個方法中,最為重要的有3個: initialize:初始化,在給,map端每一個分割槽的每一個key進行初始化,給0 update:在map端聚合 merge: 在reduce端聚合 Java版程式碼: package com.bjsxt; im

vue定義組件插件

comment tty index all target mark cal ali lan vue中自定義組件(插件) 原創 2017年01月04日 22:46:43 標簽: 插件 在vue項目中,可以自定義組件像vue-resource一樣使用Vue.use(

大資料學習之路90-sparkSQL定義聚合函式UDAF

什麼是UDAF?就是輸入N行得到一個結果,屬於聚合類的。 接下來我們就寫一個求幾何平均數的一個自定義聚合函式的例子 我們從開頭寫起,先來看看需要進行計算的數如何產生: package com.test.SparkSQL import java.lang import org

oracle資料庫定義split函式

--dba授予建立型別的許可權 grant CREATE ANY TYPE to userName; --普通使用者建立 CREATE OR REPLACE TYPE type_str IS TABLE OF VARCHAR2 (100) ; -- 再建立split函式,程式碼如下: C

ORACLE的sysdate時間函式擴充套件dual

SYSDATE函式可以得到目前系統的時間, 例如:select sysdate from dual; SYSDATE函式常用的格式舉例如下:     --加法相關     select sysdate,add_months(sysdate,12) from dual;

pyspark 定義聚合函式 UDAF

自定義聚合函式 UDAF 目前有點麻煩,PandasUDFType.GROUPED_AGG 在2.3.2的版本中不知怎麼回事,不能使用! 這樣的話只能曲線救國了!     PySpark有一組很好的聚合函式(例如,count,countDistinct,min,max,avg,su

mxnet定義損失函式和評估標準

mxnet中使用MakeLoss自定義損失函式 mxnet.symbol.MakeLoss(data=None, grad_scale=_Null, valid_thresh=_Null, normalization=_Null, name=None, a

c++ map定義比較函式按key和按value

按key: //自定義map的key typedef struct UrlKey { uint64_t dwBussID; uint64_t dwVersion; uint64

PostgreSql的聚合函式string_agg和定義聚合函式group_concat

1.使用自定義聚合函式  group_concat SELECT * FROM ( SELECT "FFID",CAST ("BRDNO" AS INTEGER),"count" (*) AS "NUM", array_to_string(g

spark1.5 定義聚合函式UDAF

自定義聚合函式需要實現UserDefinedAggregateFunction,以下是該抽象類的定義,加了一點註釋: /* * Licensed to the Apache Software Foundation (ASF) under one or more * co

14.Spark SQL:UDAF定義聚合函式實戰

UDAF自定義函式實戰 UDAF:User Defined Aggregate Function。使用者自定義聚合函式。是Spark 1.5.x引入的最新特性。 UDF,其實更多的是針對單行輸入,返

pytorch定義損失函式

在使用深度學習中,大家有各種各樣的訓練任務,torch.optim中存在的優化演算法難免不能滿足大家的需求,此時就需要自定義損失函數了,可參考如下過程: import torch.nn as nn class DiceLoss(nn.Module): def __init__(self

postgresql 9.3 定義聚合函式實現多行資料合併成一列

前言 常見的一種需求,如下圖(1): 目前需要按右邊的factor_code進行分組,將左邊的behavior_code這一列通過指定分隔符連線起來,比如通過<br /> 來連線,理想的效果應當是如下圖(2)這樣: 下面就來討論一下實現

資料庫定義儲存函式詳解

        MySQL資料庫中有很多已經存在的函式,比如count、sun、min、max和avg等等,除了這些,我們還可以自定義自己所需要的儲存函式,其建立儲存函式的基本形式如下:CREATE FUNCTION func_name ([func_parameter[,.

Hive使用者定義聚合函式(UDAF)

使用者自定義聚合函式,使用者提供的多個入參通過聚合計算(求和、求最大值、求最小值)得到一個聚合計算結果的函式。 問題:UDF也可以提供輸入多個引數然後輸出一個結果的運算,比如加法運算add(3,5),add這個UDF需要實現UDF的evaluate方法,那麼UDF和UD

在iOS11 定義titleview問題位置 按鈕點擊

icc ont init uicolor 控制 gpo avt arc sig 1、在自定義titleview的.h文件 裏重寫 intrinsicContentSize 屬性 @property(nonatomic, assign) CGSize intrinsicCo