Пользовательские агрегатные функции с несколькими входными столбцами в PostgreSQL - PullRequest
10 голосов
/ 15 апреля 2011

Я пытаюсь создать пользовательские статистические функции , которые используют несколько столбцов в качестве входных данных и выводят один столбец.

Например, для вычисления средневзвешенного значения, мы могли бы использовать два столбца с именами num_samples и quantity с таким запросом:

SELECT sum(num_samples * quantity) / sum(num_samples) AS weighted_avg FROM table; 

Однако функции, которые я хочу определить, довольно сложные (например, взвешенное стандартное отклонение)и используются много раз.Я хотел бы определить свои собственные агрегатные функции, чтобы их можно было легко использовать в запросах выбора.Например, если бы я хотел найти средневзвешенную и общую сумму, я бы использовал такой запрос:

SELECT weighted_avg(num_samples, quantity), sum(quantity)

Однако из документации видно, что для пользовательских агрегатов допускается только одинпеременная состояния, но в этом примере потребуются две переменные состояния: одна для промежуточного итога quantity и одна для промежуточного итога num_samples.

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

Ответы [ 2 ]

2 голосов
/ 01 января 2012

См. Это: Как создавать агрегаты из нескольких столбцов , доступный с PostgreSQL 8.2

Что касается нескольких переменных состояния, как сказал Джек, вы можете использовать массив в качестве состоянияпеременная.

0 голосов
/ 16 апреля 2011

По вашей ссылке: «avg (среднее) является более сложным примером агрегата. Для него требуется две части рабочего состояния: сумма входов и количество входов. Окончательный результат получается путем деления эти величины. Среднее значение обычно реализуется с использованием двухэлементного массива в качестве значения состояния. "

Как насчет того, чтобы сделать что-то подобное?

...