Home Explore Blog CI



postgresql

2nd chunk of `doc/src/sgml/xaggr.sgml`
560717a0963c965164d1540250a100cf8efef15c118c512b0000000100000fa3
 instead — the SQL standard
   expects <function>sum</function> to behave that way.  We can do this simply by
   omitting the <literal>initcond</literal> phrase, so that the initial state
   value is null.  Ordinarily this would mean that the <literal>sfunc</literal>
   would need to check for a null state-value input.  But for
   <function>sum</function> and some other simple aggregates like
   <function>max</function> and <function>min</function>,
   it is sufficient to insert the first nonnull input value into
   the state variable and then start applying the transition function
   at the second nonnull input value.  <productname>PostgreSQL</productname>
   will do that automatically if the initial state value is null and
   the transition function is marked <quote>strict</quote> (i.e., not to be called
   for null inputs).
  </para>

  <para>
   Another bit of default behavior for a <quote>strict</quote> transition function
   is that the previous state value is retained unchanged whenever a
   null input value is encountered.  Thus, null values are ignored.  If you
   need some other behavior for null inputs, do not declare your
   transition function as strict; instead code it to test for null inputs and
   do whatever is needed.
  </para>

  <para>
   <function>avg</function> (average) is a more complex example of an aggregate.
   It requires
   two pieces of running state: the sum of the inputs and the count
   of the number of inputs.  The final result is obtained by dividing
   these quantities.  Average is typically implemented by using an
   array as the state value.  For example,
   the built-in implementation of <function>avg(float8)</function>
   looks like:

<programlisting>
CREATE AGGREGATE avg (float8)
(
    sfunc = float8_accum,
    stype = float8[],
    finalfunc = float8_avg,
    initcond = '{0,0,0}'
);
</programlisting>
  </para>

  <note>
   <para>
   <function>float8_accum</function> requires a three-element array, not just
   two elements, because it accumulates the sum of squares as well as
   the sum and count of the inputs.  This is so that it can be used for
   some other aggregates as well as <function>avg</function>.
   </para>
  </note>

  <para>
   Aggregate function calls in SQL allow <literal>DISTINCT</literal>
   and <literal>ORDER BY</literal> options that control which rows are fed
   to the aggregate's transition function and in what order.  These
   options are implemented behind the scenes and are not the concern
   of the aggregate's support functions.
  </para>

  <para>
   For further details see the
   <xref linkend="sql-createaggregate"/>
   command.
  </para>

 <sect2 id="xaggr-moving-aggregates">
  <title>Moving-Aggregate Mode</title>

  <indexterm>
   <primary>moving-aggregate mode</primary>
  </indexterm>

  <indexterm>
   <primary>aggregate function</primary>
   <secondary>moving aggregate</secondary>
  </indexterm>

  <para>
   Aggregate functions can optionally support <firstterm>moving-aggregate
   mode</firstterm>, which allows substantially faster execution of aggregate
   functions within windows with moving frame starting points.
   (See <xref linkend="tutorial-window"/>
   and <xref linkend="syntax-window-functions"/> for information about use of
   aggregate functions as window functions.)
   The basic idea is that in addition to a normal <quote>forward</quote>
   transition function, the aggregate provides an <firstterm>inverse
   transition function</firstterm>, which allows rows to be removed from the
   aggregate's running state value when they exit the window frame.
   For example a <function>sum</function> aggregate, which uses addition as the
   forward transition function, would use subtraction as the inverse
   transition function.  Without an inverse transition function, the window
   function mechanism must recalculate the aggregate from scratch each time
   the frame starting point moves, resulting in run time proportional to the
   number of input rows

Title: Advanced User-Defined Aggregates in PostgreSQL
Summary
PostgreSQL's user-defined aggregates can handle complex scenarios, including null values, multiple state values, and moving-aggregate mode, which allows for faster execution of aggregate functions within windows with moving frame starting points.