如何获得Postgresql中每种产品的中位数?

我有一张叫“ sales”的桌子。

create table sales
    (
        cust    varchar(20),prod    varchar(20),day integer,month   integer,year    integer,state   char(2),quant   integer
    );
insert into sales values ('Bloom','Pepsi',2,12,2001,'NY',4232);
insert into sales values ('Knuth','Bread',23,5,2005,'PA',4167);
insert into sales values ('Emily',22,1,2006,'CT',4404);
insert into sales values ('Emily','Fruits',11,2000,'NJ',4369);
insert into sales values ('Helen','Milk',7,210);
insert into sales values ('Emily','Soap',4,2002,2549);
insert into sales values ('Bloom','Eggs',30,559);

..共有498行。这是此表的概述:

如何获得Postgresql中每种产品的中位数?

现在,我想获取每种产品的中位数。结果表应如下所示:

如何获得Postgresql中每种产品的中位数?

我已经尝试过这些代码,并且可以正常工作:

CREATE OR REPLACE FUNCTION _final_median(NUMERIC[])
   RETURNS NUMERIC AS
$$
   SELECT AVG(val)
   FROM (
     SELECT val
     FROM unnest($1) val
     ORDER BY 1
     LIMIT  2 - MOD(array_upper($1,1),2)
     OFFSET CEIL(array_upper($1,1) / 2.0) - 1
   ) sub;
$$
LANGUAGE 'sql' IMMUTABLE;

CREATE AGGREGATE median(NUMERIC) (
  SFUNC=array_append,STYPE=NUMERIC[],FINALFUNC=_final_median,INITCOND='{}'
);


SELECT prod,round(median(quant)) AS median_quant FROM sales
group by prod
order by prod;

但是我想使用“聚合”功能获得相同的结果,如果有的话我可以在没有特殊功能的情况下做到这一点?

xuxianbing11 回答:如何获得Postgresql中每种产品的中位数?

中位数为0.5个百分点(值在有序集的中间)。您可以使用percentile_cont进行计算:

select percentile_cont(0.50) within group (order by sales.quant)
from sales
,

似乎聚合函数试图找到较高的中位数。

在这种情况下,可以使用降序的PERCENTILE_DISC(0.5)进行聚合。

select prod,count(*) as total_prod,percentile_disc(0.5) within group (order by quant desc) as ceil_median_quant
from sales
group by prod;

在妊娠here上进行的测试

本文链接:https://www.f2er.com/3091484.html

大家都在问