2017-08-10 97 views
0

我有一個函數的問題,我需要按兩列分組,並採取另一列的平均值。由兩列分組,並找到另一個PostgreSQL中的平均值

爲什麼以下不起作用?

CREATE OR REPLACE FUNCTION core.cal_average_load(
    cell_load  DOUBLE PRECISION, 
    id   DOUBLE PRECISION, 
    s_id   DOUBLE PRECISION 
) RETURNS DOUBLE PRECISION 
    LANGUAGE plpgsql 
AS $$ 
DECLARE out DOUBLE PRECISION; 
    BEGIN 
    out := (AVG(cell_load) OVER (PARTITION BY id, s_id)); 
    RETURN out; 
    END; 
$$; 

上面只返回我的average_load值,與cell_load值完全一樣,沒有任何聚合。

id s_id cell_load average_load 
1  1  4    6 
1  1  2    6 
1  1  12   6 
1  2  3    4 
1  2  5    4 
2  1  10   4.33 
2  1  1    4.33 
2  2  2    3.66 
2  2  3    3.66 
2  2  6    3.66 
+1

輸入的函數(cell_load)是一個單一的值。將聚合函數(平均值)應用於單個值將導致相同的值。彙總函數用於一組值 –

+0

是的,但我需要按id和s_id分組的「cell_load」值的平均值。 我在想沒有必要打印表格的樣本。 – jovicbg

+0

然後,爲什麼你將'cell_load'作爲參數傳遞給函數?另外兩個參數將足以從* aggregate *中選擇*正好一個* cell *。 '從id = $ 2和s_id = $ 3'的the_table中選擇AVG(cell_value)將給出一個標量結果。 – wildplasser

回答

3

您正在調用單行的函數。使用窗口函數僅適用於具有多行的數據集。我不認爲你需要一個功能可言,例如:

with my_table(id, s_id, cell_load) as (
values 
    (1, 1, 1), 
    (1, 1, 2), 
    (1, 2, 3), 
    (1, 2, 4), 
    (1, 2, 5) 
) 

select id, s_id, avg(cell_load) over (partition by id, s_id) 
from my_table; 

id | s_id |  avg   
----+------+-------------------- 
    1 | 1 | 1.5000000000000000 
    1 | 1 | 1.5000000000000000 
    1 | 2 | 4.0000000000000000 
    1 | 2 | 4.0000000000000000 
    1 | 2 | 4.0000000000000000 
(5 rows) 

或:

select id, s_id, avg(cell_load) 
from my_table 
group by 1, 2; 

id | s_id |  avg   
----+------+-------------------- 
    1 | 1 | 1.5000000000000000 
    1 | 2 | 4.0000000000000000 
(2 rows)  

如果該功能是必要的,應該是這樣的:

create or replace function cal_average_load(
    _id double precision, 
    _s_id double precision) 
returns double precision 
language sql as $$ 
    select avg(cell_load) 
    from my_table 
    where id = _id and s_id = _s_id 
$$; 
+0

A有大約500,000行。 :) – jovicbg

+0

因此,使用'where'來限制所需輸出的結果。 – klin

+0

我不確定我現在瞭解你,我不能使用任何限制,需要整桌。我剛剛編輯我的問題添加表格示例 – jovicbg

相關問題