Как сгруппировать данные по внешнему виду в заранее заданные сегменты в MYSQL

0

pic 1

привет, Как я могу группировать данные на основе внешнего вида, в предварительно заданные ведра в MYSQL? скажем, мои выступления похожи на изображение 1, и мне нужен вывод, как показано на рисунке 2? (значения диапазонов предварительно заданы) заблаговременно

pic 2

pic 3

  • 0
    Пожалуйста, измените ваш вопрос, чтобы включить пример ввода и вывода в виде текста / кода, а не изображений.
Теги:
range
bucket
appearance

1 ответ

0

Вы можете решить это через вторую таблицу, которая определяет диапазоны, а затем использовать соединение в запросе GROUP BY. Шаги будут следующими:

  1. Создайте новую таблицу с диапазонами
  2. Разработайте запрос для подсчета и группировки исходных данных
  3. Запустите запрос JOIN в новой таблице диапазонов, чтобы определить, в каком ведре будет установлен счет.

Создание и заполнение новой таблицы для диапазонов будет простым (попробуйте избежать названия "диапазон", поскольку это ключевое слово):

CREATE TABLE sections
(
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(50),
    start INT,
    end INT
);

Заполните его своими разделами:

INSERT INTO sections(name, start, end) VALUES ('0-2', 0, 2);
[...]
INSERT INTO sections(name, start, end) VALUES ('11+', 11, 1<<31);

Создайте запрос для группировки и подсчета ваших данных. В этом примере используется таблица с названием "события" с столбцами "catId" и "timestamp":

SELECT
    COUNT(*) as eventCount
FROM
    events
GROUP BY
    catId

Это может создать такой результат (имеется только 5 различных кошачьих идентификаторов):

+------------+
| eventCount |
+------------+
|          3 |
|          3 |
|          5 |
|          1 |
|          1 |
+------------+

Теперь вам нужно ПРИСОЕДИНИТЬ этот результат в таблицу sections, используя условие ON. Для учебных целей промежуточный (но не рабочий) запрос будет выглядеть следующим образом:

SELECT
    s.id,
    s.name,
    s.start,
    s.end,
    COUNT(*) AS sectionCount
FROM
    sections s
JOIN
    (__your_previous_result_here__) e
ON
    e.eventCount BETWEEN s.start AND s.end
GROUP BY
    s.id

Ваш общий запрос будет выглядеть так:

SELECT
    s.id,
    s.name,
    s.start,
    s.end,
    COUNT(*) AS sectionCount
FROM
    sections s
JOIN
    (SELECT
         COUNT(*) as eventCount
     FROM
         events
     GROUP BY
         catId) e
ON
    e.eventCount BETWEEN s.start AND s.end
GROUP BY
    s.id

Обратите внимание, что здесь используются псевдонимы s и e. В зависимости от входных данных результат будет выглядеть так:

+----+------+-------+------------+--------------+
| id | name | start | end        | sectionCount |
+----+------+-------+------------+--------------+
|  1 | 0-1  |     0 |          1 |            2 |
|  2 | 2-4  |     2 |          4 |            2 |
|  3 | 5++  |     5 | 2147483647 |            1 |
+----+------+-------+------------+--------------+
  • 0
    привет, Progman, большое спасибо за вашу помощь! У меня есть два вопроса о решении, которое вы написали здесь: 1) Как вы можете видеть на рис. 2, одним из предустановленных диапазонов в моем примере был диапазон «7–10», и с тех пор не было подходящего события. для этого диапазона в таблице 'events', мы не видим соответствующей строки для этого диапазона. Что мне следует изменить в коде, чтобы появилась соответствующая строка со значением 0 для поля "Secion Count"?
  • 0
    2) мое окончательное отображение вывода должно включать в себя% от общего числа секций, поэтому, если вы посмотрите в моем примере, всего было 6 появлений, 1 в диапазоне 0-2, 4 в 3-6 диапазон, 0 в диапазоне 7-10 и 1 в диапазоне 11+, необходимый дисплей должен быть таким же, как на рис3, который я добавил в свой пост только сейчас. Еще раз спасибо за вашу благодарную помощь!
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню