繁体   English   中英

如何获得 Postgresql 中每个产品的中值?

[英]How can I get the median value of each product in Postgresql?

我有一张名为“销售”的表。

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', 'Pepsi', 22, 1, 2006, 'CT', 4404);
insert into sales values ('Emily', 'Fruits', 11, 1, 2000, 'NJ', 4369);
insert into sales values ('Helen', 'Milk', 7, 11, 2006, 'CT', 210);
insert into sales values ('Emily', 'Soap', 2, 4, 2002, 'CT', 2549);
insert into sales values ('Bloom', 'Eggs', 30, 11, 2000, 'NJ', 559);

.... 总共有 498 行。 以下是该表的概述:

在此处输入图像描述

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

在此处输入图像描述

我已经尝试过这些代码并且它有效:

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;

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

中位数是第 0.5 个百分位数(在有序集合中间的值)。 您可以使用percentile_cont来计算它:

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

似乎聚合 function 试图找到上中位数。

在这种情况下,可以使用降序的 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;

对 reextester 的测试在这里

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM