SQL でヒストグラムを作成
前提条件
select
version();
version
--------------------------------------------------------------------------------
PostgreSQL 8.4.2 on i686-pc-linux-gnu, compiled by GCC gcc (GCC) 4.3.4, 32-bit
(1 row)
select
min(o_total),
max(o_total),
count(*)
from orders;
min | max | count
------+--------+-------
1.11 | 359.80 | 25920
(1 row)
コード
select
x_from, x_to,
count(*) as y_freq
from (
select
ceil((cx - 1) * u_val) as x_from,
ceil(cx * u_val) as x_to
from (
select
u_val,
ceil(o_total / u_val) as cx
from (
select
max_val / breaks as u_val
from (
select
max(o_total) as max_val,
1 + log(2, count(*)) as breaks
from orders
) s0
) s1,
orders
) s2
) s3
group by x_from, x_to
order by x_from
実行結果
x_from | x_to | y_freq
--------+------+--------
0 | 23 | 1432
23 | 46 | 1696
46 | 69 | 1651
69 | 92 | 1662
92 | 115 | 1690
115 | 138 | 1651
138 | 161 | 1652
161 | 184 | 1673
184 | 207 | 1754
207 | 230 | 1699
230 | 253 | 1699
253 | 276 | 1678
276 | 299 | 1631
299 | 322 | 1716
322 | 345 | 1634
345 | 368 | 1002
(16 rows)
解説
といっても, breaks を求めている, この式しかありません.
1 + log(2, count(*)) as breaks
PostgreSQL には, width_bucket という関数がありますね.
return the bucket to which operand would be assigned in an equidepth histogram with count buckets, in the range b1 to b2
Table 9-3. Mathematical Functions, PostgreSQL 8.4.2 Documentation
この関数は, 似たようなことをやっていそうですが, 動作は確認していません.
| 固定リンク
この記事へのコメントは終了しました。
コメント