2011-12-16 25 views
6

He estado tratando de entender los agregados en PostgreSQL (8.4 o 9.1) que aceptan uno o más parámetros de opción.Agregados de PostgreSQL con múltiples parámetros

Un ejemplo sería crear una extensión PL/R para calcular el p-ésimo cuantil, con 0 <= p <= 1. Esto sería algo como quantile(x,p), y como parte de una consulta:

select category,quantile(x,0.25) 
from TABLE 
group by category 
order by category; 

Dónde TABLE (category:text, x:float).

Sugerencias?

Respuesta

5

Afortunadamente este ejemplo ayudará. Necesita una función que tome (accumulator, aggregate-arguments) y devuelva el nuevo valor del acumulador. Juega con el siguiente código y eso te dará una idea de cómo encaja todo.

BEGIN; 

CREATE FUNCTION sum_product_fn(int,int,int) RETURNS int AS $$ 
    SELECT $1 + ($2 * $3); 
$$ LANGUAGE SQL;   

CREATE AGGREGATE sum_product(int, int) (
    sfunc = sum_product_fn, 
    stype = int, 
    initcond = 0 
); 

SELECT 
    sum(i) AS one,  
    sum_product(i, 2) AS double, 
    sum_product(i,3) AS triple 
FROM generate_series(1,3) i; 

ROLLBACK;  

que debe darle algo como:

one | double | triple 
-----+--------+-------- 
    6 |  12 |  18 
3

Esto se puede lograr con la función NTILE ventanas

-- To calculate flexible quantile ranges in postgresql, for example to calculate n equal 
-- frequency buckets for your data for use in a visualisation (such as binning for a 
-- choropleth map), you can use the following SQL: 

-- this functions returns 6 equal frequency bucket ranges for my_column. 
SELECT ntile, avg(my_column) AS avgAmount, max(my_column) AS maxAmount, min(my_column) AS  minAmount 
FROM (SELECT my_column, ntile(6) OVER (ORDER BY my_column) AS ntile FROM my_table) x 
GROUP BY ntile ORDER BY ntile 

Puede encontrar más información sobre la función NTILE() y de ventanas en http://database-programmer.blogspot.com/2010/11/really-cool-ntile-window-function.html

+0

¡Estupendo! ¡gracias! – alfonx

+0

Downvote porque, si bien esto es definitivamente útil para calcular rangos cuartiles, la pregunta se refiere a la creación de funciones agregadas. –

Cuestiones relacionadas