Just enter the ranges you want into the table and use this to distinguish between the values.
-- SET search_path='tmp'; DROP TABLE measurements; CREATE TABLE measurements ( zval INTEGER NOT NULL PRIMARY KEY ); INSERT INTO measurements (zval) SELECT generate_series(1,1000); DELETE FROM measurements WHERE random() < 0.20 ; DROP TABLE ranges; CREATE TABLE ranges ( zmin INTEGER NOT NULL PRIMARY KEY , zmax INTEGER NOT NULL ); INSERT INTO ranges(zmin,zmax) VALUES (0, 100), (100, 200), (200, 300), (300, 400), (400, 500), (500, 600), (600, 700), (700, 800), (800, 900), (900, 1000) ; SELECT ra.zmin,ra.zmax , COUNT(*) AS zcount FROM ranges ra JOIN measurements me ON me.zval >= ra.zmin AND me.zval < ra.zmax GROUP BY ra.zmin,ra.zmax ORDER BY ra.zmin ;
Results:
zmin | zmax | zcount ------+------+-------- 0 | 100 | 89 100 | 200 | 76 200 | 300 | 76 300 | 400 | 74 400 | 500 | 86 500 | 600 | 78 600 | 700 | 75 700 | 800 | 75 800 | 900 | 80 900 | 1000 | 82 (10 rows)
wildplasser
source share