0

我想构建一个存储函数来计算组内的分位数。我有一个非常好的来自网络的 SQL 来计算中位数: http: //geekyisawesome.blogspot.ch/2012/04/finding-median-value-using-mysql-sql.html。该 SQL 允许计算表中一个变量的中位数。我想通过分组计算中位数。为此,我必须先准备一张桌子,并在组内增加计数器。即使这对我来说也是一个挑战,所以我从 stackoverflow 获得了帮助:MySQL - Counter in 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 允许像这样计算分位数:

SELECT g, QUANTILE(x,0.5) median
FROM tb
GROUP BY g
;

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

4

0 回答 0