Группировка и обработка групп внутри функций plpgsql - PullRequest
0 голосов
/ 23 сентября 2011

Мне нужно выполнить сложную групповую обработку, например здесь . Я получаю несколько строк из сложного запроса, набор строк выглядит так:

key val
-------
foo 1
foo 2
foo 3
bar 10
bar 15
baz 22
baz 44
...

А вот псевдокод, который я хочу реализовать в plpgsql:

result = new array()
group = new array()
current_key = null
for (record in (select * from superComplexQuery())) {
    if (current_key == null) {
        current_key = record.key
    }
    if (current_key != record.key) {
        result.add(processRows(group))
        group.clear()
        current_user = record.key
    }
    group.add(record)
}
if (group.size() > 0) {
    result.add(processRows(group))
}
return result

Т.е., мы должны обработать 3 строки "foo", затем 2 строки "bar", затем 2 "строки baz" и т. Д. И результат каждого processRows добавляется в результирующую коллекцию.

Может быть, я должен использовать другой подход, но я не знаю, что это должно быть.

РЕДАКТИРОВАТЬ: processRows должен выводить запись. Таким образом, результатом всей процедуры будет набор строк, где каждая строка является результатом processRows (group). Один пример такого вычисления приведен в первом предложении этого вопроса: Выбор положительного совокупного значения и игнорирование отрицательного в Postgres SQL , то есть вычисление включает в себя некоторую итерацию и агрегирование с некоторыми сложными правилами.

1 Ответ

1 голос
/ 28 сентября 2011

Правильный подход заключался в использовании Определяемых пользователем агрегатов

Т.е. я успешно реализовал свою собственную функцию агрегирования, и код выглядит как

select my_complex_aggregation((input_field_1, input_field_2, input_field_3)) 
from my_table
group by key
...