在plpgsql函数内分组和处理组

时间:2011-09-23 17:32:55

标签: postgresql stored-procedures plpgsql

我需要执行复杂的组处理,例如here。我从复杂查询中获取了一些行,行集如下所示:

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)的结果。这个计算的一个例子在这个问题的第一句中给出:Selecting positive aggregate value and ignoring negative in Postgres SQL,即计算涉及一些迭代和一些复杂规则的聚合。

1 个答案:

答案 0 :(得分:1)

正确的方法是使用User-Defined Aggregates

即。我成功实现了自己的聚合函数,代码看起来像

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