plpgsql 函数中的分组和处理组

Posted

技术标签:

【中文标题】plpgsql 函数中的分组和处理组【英文标题】:Grouping and processing groups inside plpgsql functions 【发布时间】:2011-09-23 17:32:54 【问题描述】:

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

关键值 -------- 富 1 富二 富 3 酒吧 10 酒吧 15 巴兹 22 巴兹 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,即计算涉及一些迭代和聚合,具有一些复杂的规则。

【问题讨论】:

你能解释一下你需要processRows做什么吗?如果我们对您想要做的事情有更多了解,您很可能可以使用 GROUP BY 完成此操作。 【参考方案1】:

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

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

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

【讨论】:

以上是关于plpgsql 函数中的分组和处理组的主要内容,如果未能解决你的问题,请参考以下文章

PLPGSQL 数组赋值不起作用,“赋值中的数组下标不能为空”

如何使用 plpgsql 函数插入数据?

检查 plpgsql 中的当前日志记录级别

无法从 plpgsql 函数中的动态命名临时表运行“选择进入”

使用 plpgsql 更新函数中的列

plpgsql 专家:(记录集)函数的输入和输出