« SQL でヒストグラムを作成 | トップページ | 詳細設計書の入力先は人間 »

2010年1月 4日 (月)

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 関数ですが, これは, 範囲の上限・下限, 階級の数, 対象値を渡すと, その対象値の階級を返す関数ですね. ちょっと使い途のよくわからない関数です. これを調べていて間違いに気づいたわけですけど.

|

« SQL でヒストグラムを作成 | トップページ | 詳細設計書の入力先は人間 »

コメント

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/80472/32848205

この記事へのトラックバック一覧です: SQL でヒストグラムを作成 - 訂正 -:

« SQL でヒストグラムを作成 | トップページ | 詳細設計書の入力先は人間 »