Extensiones de SQL: Agregados

Los agregados en Postgres est�n expresados en t�rminos de funciones de transici�n de estado. Es decir, un agregado puede estar definido en t�rminos de un estado que es modificado cuando una instancia es procesada. Algunas funciones de estado miran un valor particular en la instancia cuando calculan el nuevo estado (sfunc1 en la sintaxis de create aggregate ) mientras que otras s�lo se preocupan de su estado interno (sfunc2). Si definimos un agregado que utiliza solamente sfunc1, definimos un agregado que computa una funci�n de los atributos de cada instancia. "Sum" es un ejemplo de este tipo de agregado. "Sum" comienza en cero y siempre a�ade el valor de la instancia actual a su total. Utilizaremos int4pl que est� integrado en Postgres para realizar esta adici�n.

CREATE AGGREGATE complex_sum (
    sfunc1 = complex_add,
    basetype = complex,
    stype1 = complex,
    initcond1 = '(0,0)'
);

SELECT complex_sum(a) FROM test_complex;

         +------------+
         |complex_sum |
         +------------+
         |(34,53.9)   |
         +------------+

Si solamente definimos sfunc2, estamos especificando un agregado que computa una funcion que es independiente de los atributos de cada instancia. "Count" es el ejemplo m�s com�n de este tipo de agregado. . "Count" comienza a cero y a�ade uno a su total para cada instancia, ignorando el valor de instancia. Aqu�, utilizamos la rutina integrada int4inc para hacer el trabajo por nosotros. Esta rutina incrementa (a�ade uno) su argumento.

CREATE AGGREGATE my_count (
    sfunc2 = int4inc, -- add one
    basetype = int4,
    stype2 = int4,
    initcond2 = '0'
);

SELECT my_count(*) as emp_count from EMP;

         +----------+
         |emp_count |
         +----------+
         |5         |
         +----------+

"Average" es un ejemplo de un agregado que requiere tanto una funci�n para calcular la suma actual y una funci�n para calcular el contador actual. Cuando todas las instancias han sido procesadas, la respuesta final para el agregado es la suma actual dividida por el contador actual. Utilizamos las rutinas int4pl y int4inc que utilizamos anteriormente as� como tambi�n la rutina de divisi�n entera de Postgres , int4div, para calcular la divisi�n de la suma por el contador.

CREATE AGGREGATE my_average (
    sfunc1 = int4pl,     --  sum
    basetype = int4,
    stype1 = int4,
    sfunc2 = int4inc,    -- count
    stype2 = int4,
    finalfunc = int4div, -- division
    initcond1 = '0',
    initcond2 = '0'
);

SELECT my_average(salary) as emp_average FROM EMP;

         +------------+
         |emp_average |
         +------------+
         |1640        |
         +------------+