MySQL构建中值存储函数

时间:2013-12-16 09:47:26

标签: mysql median stored-functions quantile

我想构建一个存储函数来计算组内的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
;

我从未构建存储的函数/过程,并且在网络中查看存储函数中的表是硬编码的。所以,我想知道是否可以构建这样的通用函数。谢谢你的建议。

0 个答案:

没有答案