我需要执行复杂的组处理,例如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,即计算涉及一些迭代和一些复杂规则的聚合。
答案 0 :(得分:1)
正确的方法是使用User-Defined Aggregates
即。我成功实现了自己的聚合函数,代码看起来像
select my_complex_aggregation((input_field_1, input_field_2, input_field_3))
from my_table
group by key