« PostgreSQL で フィボナッチ数 | トップページ | SQL でヒストグラムを作成 - 訂正 - »

2010年1月 4日 (月)

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

この関数は, 似たようなことをやっていそうですが, 動作は確認していません.

|

« PostgreSQL で フィボナッチ数 | トップページ | SQL でヒストグラムを作成 - 訂正 - »

コメント

この記事へのコメントは終了しました。

トラックバック


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

« PostgreSQL で フィボナッチ数 | トップページ | SQL でヒストグラムを作成 - 訂正 - »