В SQL, как вы можете «сгруппировать» по диапазонам? - PullRequest
164 голосов
/ 24 октября 2008

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

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

Например:

score range  | number of occurrences
-------------------------------------
   0-9       |        11
  10-19      |        14
  20-29      |         3
   ...       |       ...

В этом примере было 11 строк с оценками в диапазоне от 0 до 9, 14 строк с оценками в диапазоне от 10 до 19 и 3 строки с оценками в диапазоне 20-29.

Есть ли простой способ настроить это? Что вы рекомендуете?

Ответы [ 14 ]

1 голос
/ 20 ноября 2015

Попробуйте

SELECT (str(range) + "-" + str(range + 9) ) AS [Score range], COUNT(score) AS [number of occurances]
FROM (SELECT  score,  int(score / 10 ) * 10  AS range  FROM scoredata )  
GROUP BY range;
1 голос
/ 15 июля 2014

Поскольку столбец, по которому сортируется (Range), является строкой, вместо числовой сортировки используется сортировка строк / слов.

До тех пор, пока строки имеют нули для заполнения числовых длин, сортировка должна быть семантически правильной:

SELECT t.range AS ScoreRange,
       COUNT(*) AS NumberOfOccurrences
  FROM (SELECT CASE
                    WHEN score BETWEEN 0 AND 9 THEN '00-09'
                    WHEN score BETWEEN 10 AND 19 THEN '10-19'
                    ELSE '20-99'
               END AS Range
          FROM Scores) t
 GROUP BY t.Range

Если диапазон смешанный, просто добавьте дополнительный ноль:

SELECT t.range AS ScoreRange,
       COUNT(*) AS NumberOfOccurrences
  FROM (SELECT CASE
                    WHEN score BETWEEN 0 AND 9 THEN '000-009'
                    WHEN score BETWEEN 10 AND 19 THEN '010-019'
                    WHEN score BETWEEN 20 AND 99 THEN '020-099'
                    ELSE '100-999'
               END AS Range
          FROM Scores) t
 GROUP BY t.Range
1 голос
/ 30 марта 2013
select t.blah as [score range], count(*) as [number of occurences]
from (
  select case 
    when score between  0 and  9 then ' 0-9 '
    when score between 10 and 19 then '10-19'
    when score between 20 and 29 then '20-29'
    ...
    else '90-99' end as blah
  from scores) t
group by t.blah

Убедитесь, что вы используете слово, отличное от 'range', если вы находитесь в MySQL, иначе вы получите ошибку при запуске приведенного выше примера.

0 голосов
/ 24 октября 2008

Возможно, вы спрашиваете о том, чтобы такие вещи продолжались ...

Конечно, вы будете вызывать полное сканирование таблицы для запросов, и если таблица, содержащая оценки, которые необходимо подсчитать (агрегации), велика, вам может потребоваться более эффективное решение, вы можете создать дополнительную таблицу и использовать правила Например, on insert - вы можете посмотреть на него.

Однако не все движки СУБД имеют правила!

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