SQLでパーセンタイル値を求める
SQLでパーセンタイル値を求めたいことがあり、以下を参考に実現できた。 口座 (accounts) テーブルで残高 (balance) column の95パーセンタイル値を求める
code:sql
SELECT balance
FROM (SELECT @row_num := @row_num + 1 AS row_num, balance
FROM accounts t,
(SELECT @row_num := 0) counter
ORDER BY balance) temp
WHERE temp.row_num = ROUND(.95 * @row_num)
;
95パーセンタイル以下の値を持つレコードに絞って平均を求める。
code:sql
SELECT AVG(balance)
FROM (
SELECT @row_num := @row_num + 1 AS row_num, balance
FROM accounts t,
(SELECT @row_num := 0) counter
ORDER BY balance
) temp
WHERE temp.row_num <= ROUND(.95 * @row_num)
;
PERCENTILE_DISCみたいな良い感じのウィンドウ関数があればよいのだが、使えない環境もある。