2011-12-26 4 views
1

10進数の範囲の頻度分布を得るために、(構文的には必ずしも効率的ではない)優雅な方法を探しています。MySQLで小数点以下の範囲の度数分布を取得

たとえば、負の値または正の値を持つ可能性のある定格列のある表があります。私は特定の範囲の評価で行の頻度を取得したい。 - ... - [-140.00)-130.00:5 - [-120.00 -130.00へ):2 - [-110.00 -120.00へ):1 - ... - [130.00から120.00) :17 - など。

[i to j]は、iを排他的に含むiを意味します。

ありがとうございます。

+0

-130、二組であるあなたが何をしたいということでしょうか? – xQbert

+2

あなたは 'select floor(rating/10)、count(*)from(table)グループを1' – ethrbunny

+0

、@ xQbert、もう1つは-130、もう1つは+130です。 – Mikko

答えて

8

あなただけのテーブルにご希望の範囲を入れて、値を区別するためにそれを使用「1(*)から(表)グループを数え、選択階(定格/ 10)」を使用してかなり近い

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を使用することができます。 -490、-490 - -

1

私は500から490まで、490から480から100点の範囲を扱うだろう

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(); 

のように多くのレベルを行うことができseomthingを考えていた、... -480 -500

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) 
関連する問題