結果のヒストグラムを作成したいようです。
PostgreSQL:
select x, count(val)
from generate_series(1,6) x
left outer join numbers on (x = width_bucket(val, 0, 60, 6))
group by x;
width_bucket
単純な除算とモジュラスの代わりに使用したのは、より一般的で、より複雑な範囲を正しくするのが簡単だからです。また、それは素晴らしいです。
必要に応じて、シーケンス生成のための Mark Bannister の再帰的 CTE を統合し、移植性を高めるためx
に の代わりにJOINgenerate_series
することができ、制限は自動的に決定できます。
with recursive ranges(rangev) as (
select 0 rangev union all select rangev+1 as rangev from ranges where rangev < 4
), bounds(lower_bucket, upper_bucket) as (
select (min(val))/10, (max(val)/10)+1 from numbers
)
select
rangev as bucket,
rangev*10 AS lower_bound,
(rangev+1)*10-1 AS upper_bound,
count(val) AS num_in_bucket
from ranges cross join bounds
left outer join numbers on (rangev = width_bucket(val, lower_bucket, upper_bucket*10, upper_bucket))
group by rangev
order by rangev asc;
やりたい場合(たとえば、MS SQL で利用できない場合) は、簡単に元に戻すことができます/10
。width_bucket
width_bucket
出力:
bucket | lower_bound | upper_bound | num_in_bucket
--------+-------------+-------------+---------------
0 | 0 | 9 | 0
1 | 10 | 19 | 2
2 | 20 | 29 | 3
3 | 30 | 39 | 0
4 | 40 | 49 | 1
(5 rows)