【发布时间】:2013-10-27 16:44:07
【问题描述】:
在 postgresql 中,如果我想要百分比,我就写:
select x / sum(x) over() ...
在函数内部它不起作用,因为聚合函数表现不佳。
我试图找到解决方案,但没有成功。 这是我真正需要的一个简单版本,但我相信这个问题的解决方案肯定会为我指明正确的方向。
更多细节...
如果我创建这个简单的表:
create table ttt(v1 numeric, v2 numeric);
insert into ttt values (2,1),(5,2),(10,4);
如果我跑步:
select v1/sum(v1) over() from ttt; --returns relative frequencies
我明白了:
select v1/sum(v1) over() from ttt;
?column?
------------------------
0.11764705882352941176
0.29411764705882352941
0.58823529411764705882
(3 rows)
现在,如果我想创建一个做同样事情的函数,我会写:
create or replace function rfreq (double precision)
returns double precision
AS
'
select
$1 / sum($1) over()
'
LANGUAGE 'sql';
我明白了:
select rfreq(v1) from bruto;
rfreq
-------
1
1
1
(3 rows)
Postgresql 不在函数内进行总结。
有什么建议吗? 谢谢, 阿里。
【问题讨论】:
-
您不能将某些聚合函数或窗口函数撕成盒装的 sql 函数。不支持。
-
是的,我意识到这一点。但我觉得奇怪的是,没有(简单的)方法来构建一个计算百分比的函数。我很确定很多人会使用它。它本身很有用,可以包含在更复杂的结构中。
-
@user2895901 - 这可能很好,但这不是通常的用户请求。但这并非不可能 - 如果我理解,您将创建一个自定义窗口函数。您可以用 C 编写自己的,也可以使用 PL/v8 语言,支持自定义窗口函数pgxn.org/dist/plv8/1.3.0/doc/plv8.html
-
好的。这听起来像是要走的路。在提出问题之前,我将自定义聚合视为一种可能的解决方案。丹尼斯在他的回答中提到了这一点,但我想我真正需要的是自定义窗口函数。谢谢。
标签: postgresql aggregate-functions percentage