Получить распределение частот десятичного диапазона в MySQL - PullRequest
1 голос
/ 26 декабря 2011

Я ищу элегантный способ (с точки зрения синтаксиса, не обязательно эффективный) для получения частотного распределения десятичного диапазона.

Например, у меня есть таблица со столбцом оценок, которая может быть отрицательной или положительной. Я хочу получить частоту строк с рейтингом определенного диапазона. - ... - [-140,00 - -130,00): 5 - [-130,00 - -120,00): 2 - [-120,00 - -110,00): 1 - ... - [120,00 до 130,00): 17 - и т. д.

[от i до j) означает, что я включаю в j эксклюзив.

Заранее спасибо.

Ответы [ 4 ]

9 голосов
/ 26 декабря 2011

Вы можете быть достаточно близко, используя 'select floor (rating / 10), count (*) из (table) group на 1'

1 голос
/ 26 декабря 2011

Я думал о чем-то, что могло бы сделать много уровней, таких как

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

0 голосов
/ 26 декабря 2011

Просто поместите желаемые диапазоны в таблицу и используйте их для различения значений.

-- 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)
0 голосов
/ 26 декабря 2011

при условии конечного числа диапазонов.

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 для генерации выбора, допускающего количество диапазонов, однако вы можете столкнуться с ограничением столбца.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...