我正在寻找一种优雅的方式(在语法方面,不一定有效)来获得小数范围的频率分布。
例如,我有一个带有评级列的表,可以是负数或正数。我想得到具有一定范围等级的行频率。 - ...... - [-140.00至-130.00):5 - [-130.00至-120.00):2 - [-120.00至-110.00):1 - ...... - [120.00至130.00):17 - 等等。
[i to j]表示我包含j独家。
提前致谢。
答案 0 :(得分:9)
你可以使用'选择楼层(评级/ 10),从(桌子)组计数(*)1'
答案 1 :(得分:1)
我在考虑可以做很多级别的事情,比如
DELIMITER $$
CREATE PROCEDURE populate_stats()
BEGIN
DECLARE range_loop INT Default 500 ;
simple_loop: LOOP
SET the_next = range_loop - 10;
Select sum(case when range between range_loop and the_next then 1 else 0 end) from table,
IF the_next=-500 THEN
LEAVE simple_loop;
END IF;
END LOOP simple_loop;
END $$
usage: call populate_stats();
将处理100个范围从500-490,490-480,...... -480 - -490,-490 - -500
答案 2 :(得分:0)
假设范围有限。
Select
sum(case when val between -140 to -130 then 1 else 0 end) as sum-140_to_-130,
sum(Case when val between -130 to -120 then 1 else 0 end) as sum-130_to_-140,
...
FROM table
如果没有,您可以使用动态SQL生成允许多个范围的选择,但是您可能会遇到列限制。
答案 3 :(得分:0)
只需将您想要的范围放入表中,然后使用它来区分值。
-- 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
;
结果:
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)