将初始条件作为参数传递给自定义聚合

时间:2015-07-22 19:35:51

标签: postgresql aggregate-functions

我想创建一个函数,它将初始条件作为参数,并使用一组值来计算最终结果。在我的特定情况下(与PostGIS中的几何处理有关),重要的是集合中的每个成员一次一个地处理当前(可能是初始)状态以保持结果清洁。 (我需要处理条子和间隙问题,并且除了一次一个元素之外,还有很难做到这一点。)我需要做的处理已经被定义为一个带有两个适当参数的函数(其中第一个可以是当前状态,第二个可以是集合中的值。

所以我想要一些与你期望的相似的东西:

SELECT my_func('some initial condition', my_table.some_column) FROM my_table;

聚合似乎很适合这个,但我无法弄清楚如何让函数接受初始状态。 PL / pgSQL中的迭代方法非常简单:

CREATE FUNCTION my_func(initial sometype, values sometype[])
  -- Returns, language, etc.
  AS $$
  DECLARE
    current sometype := initial;
    v sometype;
  BEGIN
    FOREACH v IN ARRAY values LOOP
      current := SomeBinaryOperation(current, v);
    END LOOP;

    RETURN current;
  END
  $$

但是需要手动将值滚动到数组中:

SELECT my_func('some initial condition', ARRAY_AGG(my_table.some_column)) FROM my_table;

您可以创建具有多个参数的聚合,但第一个参数后面的参数将用作转换函数的附加参数。我看不出其中任何一个可能变成初始状态。 (至少没有一个非常hacky函数,如果第一个参数是NULL或类似的话,它将第三个参数视为初始条件。并且仅当聚合参数可以是常量而不是列时。)

我最好只使用PL / pgSQL迭代方法,还是有办法创建一个接受其初始条件作为参数的聚合?还是有什么我没有想过的?

目前我正在使用PostgreSQL 9.3,但如果有新内容可以帮助升级可能是一种选择。

0 个答案:

没有答案