由两列分组,并找到另一个PostgreSQL中的平均值

问题描述:

我有一个函数的问题,我需要按两列分组,并采取另一列的平均值。由两列分组,并找到另一个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

您正在调用单行的函数。使用窗口函数仅适用于具有多行的数据集。我不认为你需要一个功能可言,例如:

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