SQL でヒストグラムを作成 - 訂正 -
よくみてみると, 各階級の結果が微妙におかしかったようです. 丸めが適当にすぎたのが原因でした. 以下のとおり, 謹んで訂正をさせていただきます.
コード
select
x_from, x_to,
count(*) as y_freq
from (
select
(cx - 1) * u_val as x_from,
cx * u_val as x_to
from (
select
u_val,
ceil(o_total / u_val) as cx
from (
select
ceil(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 | 1435
23 | 46 | 1698
46 | 69 | 1649
69 | 92 | 1667
92 | 115 | 1686
115 | 138 | 1663
138 | 161 | 1650
161 | 184 | 1676
184 | 207 | 1754
207 | 230 | 1707
230 | 253 | 1700
253 | 276 | 1672
276 | 299 | 1631
299 | 322 | 1719
322 | 345 | 1641
345 | 368 | 972
(16 rows)
前バージョンとの差分
--- hist_v_0.0.1.sql 2010-01-04 03:07:20.372303040 +0900
+++ hist_v_0.0.2.sql 2010-01-04 03:10:55.108940398 +0900
@@ -3,15 +3,15 @@
count(*) as y_freq
from (
select
- ceil((cx - 1) * u_val) as x_from,
- ceil(cx * u_val) as x_to
+ (cx - 1) * u_val as x_from,
+ 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
+ ceil(max_val / breaks) as u_val
from (
select
max(o_total) as max_val,
解説の続き
PostgreSQL の width_bucket 関数ですが, これは, 範囲の上限・下限, 階級の数, 対象値を渡すと, その対象値の階級を返す関数ですね. ちょっと使い途のよくわからない関数です. これを調べていて間違いに気づいたわけですけど.
| 固定リンク
この記事へのコメントは終了しました。
コメント