aboutsummaryrefslogtreecommitdiff
path: root/doc/man/create_aggregate.l
diff options
context:
space:
mode:
Diffstat (limited to 'doc/man/create_aggregate.l')
-rw-r--r--doc/man/create_aggregate.l94
1 files changed, 94 insertions, 0 deletions
diff --git a/doc/man/create_aggregate.l b/doc/man/create_aggregate.l
new file mode 100644
index 00000000000..645c54f8a51
--- /dev/null
+++ b/doc/man/create_aggregate.l
@@ -0,0 +1,94 @@
+.\" This is -*-nroff-*-
+.\" XXX standard disclaimer belongs here....
+.\" $Header: /cvsroot/pgsql/doc/man/Attic/create_aggregate.l,v 1.1.1.1 1996/08/18 22:14:21 scrappy Exp $
+.TH "CREATE AGGREGATE" SQL 11/05/95 Postgres95 Postgres95
+.SH NAME
+create aggregate \(em define a new aggregate
+.SH SYNOPSIS
+.nf
+\fBcreate aggregate\fR agg-name [\fBas\fR]
+ \fB(\fP[\fBsfunc1\fR \fB=\fR state-transition-function-1
+ ,\fP \fBbasetype\fR \fB=\fR data-type
+ ,\fP \fBstype1\fR \fB=\fR sfunc1-return-type]
+ [\fB,\fP \fBsfunc2\fR \fB=\fR state-transition-function-2
+ ,\fP \fBstype2\fR \fB=\fR sfunc2-return-type]
+ [\fB,\fP \fBfinalfunc\fR \fB=\fR final-function]
+ [\fB,\fP \fBinitcond1\fR \fB=\fR initial-condition-1]
+ [\fB,\fP \fBinitcond2\fR \fB=\fR initial-condition-2]\fB)\fR
+.fi
+.SH DESCRIPTION
+An aggregate function can use up to three functions, two
+.IR "state transition"
+functions, X1 and X2:
+.nf
+X1( internal-state1, next-data_item ) ---> next-internal-state1
+X2( internal-state2 ) ---> next-internal-state2
+.fi
+and a
+.BR "final calculation"
+function, F:
+.nf
+F(internal-state1, internal-state2) ---> aggregate-value
+.fi
+These functions are required to have the following properties:
+.IP
+The arguments to state-transition-function-1 must be
+.BR ( stype1 , basetype ) ,
+and its return value must be stype1.
+.IP
+The argument and return value of state-transition-function-2 must be
+.BR stype2 .
+.IP
+The arguments to the final-calculation-function must be
+.BR ( stype1 , stype2 ) ,
+and its return value must be a POSTGRES base type (not
+necessarily the same as basetype.
+.IP
+The final-calculation-function should be specified if and only if both
+state-transition functions are specified.
+.PP
+Note that it is possible to specify aggregate functions that have
+varying combinations of state and final functions. For example, the
+\*(lqcount\*(rq aggregate requires
+.BR sfunc2
+(an incrementing function) but not
+.BR sfunc1 " or " finalfunc ,
+whereas the \*(lqsum\*(rq aggregate requires
+.BR sfunc1
+(an addition function) but not
+.BR sfunc2 " or " finalfunc
+and the \*(lqaverage\*(rq aggregate requires both of the above state
+functions as well as a
+.BR finalfunc
+(a division function) to produce its answer. In any case, at least
+one state function must be defined, and any
+.BR sfunc2
+must have a corresponding
+.BR initcond2 .
+.PP
+Aggregates also require two initial conditions, one for each
+transition function. These are specified and stored in the database
+as fields of type
+.IR text .
+.SH EXAMPLE
+This
+.IR avg
+aggregate consists of two state transition functions, a addition
+function and a incrementing function. These modify the internal state
+of the aggregate through a running sum and and the number of values
+seen so far. It accepts a new employee salary, increments the count,
+and adds the new salary to produce the next state. The state
+transition functions must be passed correct initialization values.
+The final calculation then divides the sum by the count to produce the
+final answer.
+.nf
+--
+--Create an aggregate for int4 average
+--
+create aggregate avg (sfunc1 = int4add, basetype = int4,
+ stype1 = int4, sfunc2 = int4inc, stype2 = int4,
+ finalfunc = int4div, initcond1 = "0", initcond2 = "0")
+.fi
+.SH "SEE ALSO"
+create function(l),
+remove aggregate(l).