[英]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.