我想构建一个存储函数来计算组内的quantils。我有一个很好的SQL来自网络计算中位数:http://geekyisawesome.blogspot.ch/2012/04/finding-median-value-using-mysql-sql.html。此SQL允许计算表的一个变量的中值。我想通过分组计算中位数。要做到这一点,我必须准备一个增加计数器组的表。即使这对我来说也是一个挑战,所以我从stackoverflow得到了帮助:MySQL - Counter within group。总而言之,我能够在群体中计算中位数:
-- (01) Create table fake table:
CREATE TABLE test01.tb (
g CHAR(1)
, x INTEGER
);
INSERT INTO test01.tb (g, x)
VALUES
('a',10)
, ('a',2)
, ('a',0)
, ('b',10)
, ('b',10)
, ('b',10)
, ('b',1)
, ('b',1)
, ('b',1)
;
-- (02) Create enumerated table
CREATE TABLE tb2 AS
SELECT a.g, a.x
, @counter := if (g = @prev_g, @counter + 1, 1) counter
, @prev_g := g
, (SELECT COUNT(*)
FROM tb b
WHERE a.g = b.g
) AS max_counter
FROM tb a, (SELECT @counter := 0, @prev_g := NULL) INIT
ORDER BY a.g, a.x
;
-- (03) Compute median within group
SELECT g, AVG(x)
FROM tb2
WHERE counter IN (FLOOR((max_counter+1)*0.5),CEIL((max_counter+1)*0.5))
GROUP BY g
;
我的想法是构建一个QUANTILE函数,它允许像这样计算quantils:
SELECT g, QUANTILE(x,0.5) median
FROM tb
GROUP BY g
;
我从未构建存储的函数/过程,并且在网络中查看存储函数中的表是硬编码的。所以,我想知道是否可以构建这样的通用函数。谢谢你的建议。