获取MySQL中小数范围的频率分布

时间:2011-12-26 15:12:53

标签: mysql sql

我正在寻找一种优雅的方式(在语法方面,不一定有效)来获得小数范围的频率分布。

例如,我有一个带有评级列的表,可以是负数或正数。我想得到具有一定范围等级的行频率。 - ...... - [-140.00至-130.00):5 - [-130.00至-120.00):2 - [-120.00至-110.00):1 - ...... - [120.00至130.00):17 - 等等。

[i to j]表示我包含j独家。

提前致谢。

4 个答案:

答案 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)