PostgreSQL - добавленные функции

{title}

Агрегатные функции являются очень полезным типом функций в базах данных, хотя большинство из них обрабатывают базовые функции ANSI-SQL, такие как MIN (), MAX (), AVG (), SUM (), COUNT () .
В PostgreSQL у нас есть возможность создавать собственные агрегатные функции, чтобы мы могли сказать, что PostgreSQL является одной из наиболее настраиваемых баз данных на рынке.
Как и с другими типами функций, агрегаты могут быть написаны на других языках, которые поддерживаются PostgreSQL.
Создайте агрегатную функцию
Как мы упоминали в начале, мы можем написать агрегатные функции практически на любом языке, включая SQL, эти функции обычно состоят из одной или нескольких функций, они должны иметь хотя бы одну функцию перехода состояний для выполнения вычислений и дополнительные функции для управления состоянием начальное и конечное состояние, мы даже можем использовать разные языки для каждой из этих функций, например, функцию a в PL / pgSQL и функцию b в PL / Python и т. д.
Давайте посмотрим на структуру, которой должна следовать агрегатная функция:

 CREATE AGGREGATE myagg (datatype_of_input) (SFUNC = имя_состояния_функции, STYPE = тип_состояния, FINALFUNC = окончательное_имя_функции, INITCOND = необязательный_init_state_value); 

Если конечная функция необязательна, однако, если мы ее укажем, она должна принимать результат функции состояния в качестве ввода или ввода. Эта функция состояния всегда принимает в качестве входных данных тип данных и результат последнего вызова функции статуса; Добавленные функции также могут быть несколькими столбцами.
Хотя функции, которые можно использовать и создавать, довольно просты, мы можем проявить творческий подход и создавать настоящие произведения искусства, несущие сложность.
Мы выполним функцию геометрического среднего, чтобы продемонстрировать способность PostgreSQL выполнять более сложные агрегатные функции.
Для этой функции мы будем использовать две функции, одну из которых будет функция состояния, которая будет добавлять данные в журнал, и экспоненциальный конец, который снова преобразует журналы.
Давайте посмотрим на следующем изображении функцию статуса:

{title}


Эта функция перехода состояния получает два параметра предыдущего состояния в виде одномерного массива с двумя элементами, а также следующий элемент в агрегированном процессе. Если элемент равен нулю или нулю, функция состояния вернется в предыдущее состояние другого Форма возвратит массив, где первый элемент - логарифмическая сумма, а второй - текущий счет.
В следующей функции мы возьмем сумму функции состояния и разделим ее на счет:

{title}


Поскольку у нас есть наши функции, которые выполняют весь расчет, мы объединим обе части, чтобы сгенерировать нашу статистическую функцию:

{title}


Как мы могли видеть, реализация агрегатной функции была довольно простой, конечно, логика, лежащая в ее основе, не так уж велика, однако, таким образом, мы видим, насколько полной может быть поддержка PostgreSQL на этих уровнях. Мы могли бы использовать другие языки без проблем.
На этом мы завершим этот урок, у нас уже есть более широкие знания о функциях PostgreSQL и, таким образом, мы можем расширить нашу базу данных на новые уровни, которые сделают наши приложения намного более надежными и функциональными.