由两列分组,并找到另一个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
答
您正在调用单行的函数。使用窗口函数仅适用于具有多行的数据集。我不认为你需要一个功能可言,例如:
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
$$;
输入的函数(cell_load)是一个单一的值。将聚合函数(平均值)应用于单个值将导致相同的值。汇总函数用于一组值 –
是的,但我需要按id和s_id分组的“cell_load”值的平均值。 我在想没有必要打印表格的样本。 – jovicbg
然后,为什么你将'cell_load'作为参数传递给函数?另外两个参数将足以从* aggregate *中选择*正好一个* cell *。 '从id = $ 2和s_id = $ 3'的the_table中选择AVG(cell_value)将给出一个标量结果。 – wildplasser