SQLでパーセンタイル値を求める
SQLでパーセンタイル値を求めたいことがあり、以下を参考に実現できた。
https://stackoverflow.com/a/38644788/5463335
口座 (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みたいな良い感じのウィンドウ関数があればよいのだが、使えない環境もある。
https://docs.aws.amazon.com/ja_jp/redshift/latest/dg/r_WF_PERCENTILE_DISC.html