グループ内の分位点を計算するストアド関数を作成したいと思います。ネットから中央値を計算するための非常に優れた SQL があります: http://geekyisawesome.blogspot.ch/2012/04/finding-median-value-using-mysql-sql.html。この SQL により、テーブルの 1 つの変数の中央値を計算できます。グループ化して中央値を計算したいと思います。これを最初に行うには、グループ内でカウンターが増加するテーブルを準備する必要があります。これでも私にとっては挑戦だったので、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 を構築することです。
SELECT g, QUANTILE(x,0.5) median
FROM tb
GROUP BY g
;
私はストアド関数/プロシージャを構築したことがなく、ネットを見るとストアド関数のテーブルがハードコードされています。それで、そのような汎用関数を構築することが可能かどうか疑問に思っています。アドバイスをありがとう。