2011-12-16 40 views
6

Tôi đã cố gắng quấn đầu quanh việc tạo các tập hợp trong PostgreSQL (8.4 hoặc 9.1) chấp nhận một hoặc nhiều tham số tùy chọn.PostgreSQL tổng hợp với nhiều tham số

Ví dụ sẽ tạo phần mở rộng PL/R để tính toán lượng tử thứ p, với 0 <= p <= 1. Điều này sẽ giống như thế quantile(x,p), và như là một phần của một truy vấn:

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

đâu TABLE (category:text, x:float).

Đề xuất?

Trả lời

5

Hy vọng ví dụ này sẽ hữu ích. Bạn cần một hàm nhận (accumulator, aggregate-arguments) và trả về giá trị bộ tích lũy mới. Chơi xung quanh với mã bên dưới và điều đó sẽ cho bạn cảm giác về cách mọi thứ phù hợp với nhau.

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;  

Điều đó sẽ cung cấp cho bạn một cái gì đó như:

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

này có thể đạt được với hàm NTILE windowing

-- 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 

Bạn có thể tìm hiểu thêm tại NTILE() chức năng và cửa sổ ở http://database-programmer.blogspot.com/2010/11/really-cool-ntile-window-function.html

+0

Tuyệt vời! cảm ơn bạn! – alfonx

+0

Downvote vì, trong khi điều này chắc chắn hữu ích cho việc tính toán phạm vi tứ phân, câu hỏi liên quan đến việc tạo các hàm tổng hợp. –

Các vấn đề liên quan