<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # CREATE AGGREGATE ## Name CREATE AGGREGATE?--?定義一個新的聚集函數 ## Synopsis ``` CREATE AGGREGATE _name_ ( _input_data_type_ [ , ... ] ) ( SFUNC = _sfunc_, STYPE = _state_data_type_ [ , FINALFUNC = _ffunc_ ] [ , INITCOND = _initial_condition_ ] [ , SORTOP = _sort_operator_ ] ) or the old syntax CREATE AGGREGATE _name_ ( BASETYPE = _base_type_, SFUNC = _sfunc_, STYPE = _state_data_type_ [ , FINALFUNC = _ffunc_ ] [ , INITCOND = _initial_condition_ ] [ , SORTOP = _sort_operator_ ] ) ``` ## 描述 `CREATE AGGREGATE`定義一個新的聚集函數。 一些常用的聚集函數已經包含在基礎軟件包里了;在[Section 9.20](#calibre_link-1641)里有文檔說明。 如果你需要定義一個新類型或需要一個還沒有提供的聚集函數,這時`CREATE AGGREGATE`便可派上用場。 如果給出了一個模式的名字(比如`CREATE AGGREGATE myschema.myagg ...`),那么該聚集函數是在指定模式中創建的。 否則它是在當前模式中創建的。 一個聚集函數是用它的名字和輸入數據類型來標識的。 同一模式中如果兩個聚集處理的輸入數據不同,它們可以有相同的名字。 一個聚集函數的輸入數據類型必須和所有同一模式中的普通函數的名字和輸入 類型不同。 一個聚集函數是用一個或兩個普通函數組成的:一個狀態轉換函數`_sfunc_`和一個可選的最終計算函數`_ffunc_`。 它們是這樣使用的: ``` _sfunc_( internal-state, next-data-values ) ---> next-internal-state _ffunc_( internal-state ) ---> aggregate-value ``` PostgreSQL創建一個類型為`_stype_`的臨時變量。 它保存這個聚集的當前內部狀態。對于每個輸入數據條目,都調用狀態轉換函數計算內部狀態值的新數值。 在處理完所有數據后,調用一次最終處理函數以計算聚集的返回值。如果沒有最終處理函數, 則將最后的狀態值當做返回值。 一個聚集函數還可能提供一個初始條件,也就是內部狀態值的初始值。 這個值是作為一個類型為`text`的字段存儲在數據庫里的,不過它們必須是狀態值數據類型的合法的外部 表現形式的常量。 如果沒有提供狀態,那么狀態值初始化為 NULL 。 如果該狀態轉換函數被定義為"strict",那么就不能用 NULL 輸入調用它。 此時, 聚集的執行如下所述。帶有任何 NULL 輸入值的行將被忽略(不調用此函數并且保留前一個狀態值)。 如果初始狀態值是 NULL ,那么在第一個含有非 NULL 值的行上,使用第一個參數值替換狀態值, 然后狀態轉換函數在隨后所有的含有非 NULL 值的行上調用。 這樣做讓比較容易實現像`max`這樣的聚集。 請注意這種行為只是當`_state_data_type_`與`_input_data_type_`相同的時候才表現出來。 如果這些類型不同,你必須提供一個非 NULL 的初始條件或者使用一個非"strict"的狀態轉換函數。 如果狀態轉換函數不是嚴格(strict)的,那么它將無條件地在每個輸入行上調用,并且必須自行處理 NULL 輸入和NULL 轉換值,這樣就允許聚集的作者對聚集中的 NULL 有完全的控制。 如果最終轉換函數定義為"strict",那么如果最終狀態值是NULL 時就不會調用它; 而是自動輸出一個 NULL 結果。(這才是 strict 函數的正常特征。) 不管是那種情況,最終處理函數 可以自由選擇是否返回 NULL 。 比如,`avg`的最終處理函數在零輸入記錄時 就會返回 NULL 。 行為類似`MIN`或`MAX`的聚集有時候可以優化為使用索引,而不用掃描 每個輸入行。 如果這個聚集可以如此優化,則用一個_排序操作符_標識它。 這里基本的要求是聚集 必須以操作符歸納出來的排序順序生成第一個元素;換句話說: ``` SELECT agg(col) FROM tab; ``` 必須等于: ``` SELECT col FROM tab ORDER BY col USING sortop LIMIT 1; ``` 更多的假設是聚集忽略 NULL 輸入,并且只有在輸入沒有非空數值的時候,它才生成NULL結果。 通常,數據類型的 `&lt;` 操作符是`MIN`的適用排序操作符,而 `&gt;` 是`MAX` 的適用操作符。 請注意,除非聲明的操作符是 B-tree 索引操作符類的"小于"或者"大于"策略號, 否則這種優化將不會生效。 要創建聚集函數,你必須具有相關參數類型、狀態類型和返回類型的`使用`權限,也必須具有轉換函數和最終函數的`執行`權限。 ## 參數 `_name_` 要創建的聚集函數名(可以有模式修飾) 。 `_input_data_type_` 該聚集函數要處理的輸入數據類型。要創建一個零參數聚集函數,可以使用`*`代替輸入數據類型列表。 (`count(*)`就是這種聚集函數的一個實例。 ) `_base_type_` 在以前的`CREATE AGGREGATE`語法中,輸入數據類型是通過`basetype`參數指定的,而不是寫在聚集的名稱之后。 需要注意的是這種以前語法僅允許一個輸入參數。 要創建一個零參數聚集函數,可以將`basetype`指定為`"ANY"`(而不是`*`)。 `_sfunc_` 將在每一個輸入行上調用的狀態轉換函數的名稱。 對于有`_N_`個參數的聚集函數,`_sfunc_`必須有 `_+1_ `個參數,其中的第一個參數類型為`_state_data_type_`,其余的匹配已聲明的輸入數據類型。 函數必須返回一個`_state_data_type_`類型的值。 這個函數接受當前狀態值和當前輸入數據,并返回下個狀態值。 `_state_data_type_` 聚集的狀態值的數據類型。 `_ffunc_` 在轉換完所有輸入行后調用的最終處理函數,它計算聚集的結果。 此函數必須接受一個類型為`_state_data_type_`的參數。 聚集的輸出數據 類型被定義為此函數的返回類型。 如果沒有聲明`_ffunc_`則使用聚集結果的狀態值作為聚集的結果,且輸出類型為`_state_data_type_`。 `_initial_condition_` 狀態值的初始設置(值)。 它必須是一個`_state_data_type_`類型可以接受的文本常量值。 如果沒有聲明,狀態值初始為 NULL 。 `_sort_operator_` 用于`MIN`或`MAX`類型聚集的排序操作符。 這個只是一個操作符名 (可以有模式修飾)。這個操作符假設接受和聚集一樣的輸入數據類型。 `CREATE AGGREGATE`的參數可以以任何順序書寫,而不只是上面顯示的順序。 ## 例子 參見[Section 35.10](#calibre_link-836)。 ## 兼容性 `CREATE AGGREGATE`是PostgreSQL語言的擴展。 SQL標準沒有提供用戶自定義聚集函數的功能。 ## 參見 [ALTER AGGREGATE](#calibre_link-536), [DROP AGGREGATE](#calibre_link-534)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看