MySQL Rolling Count of Rows - PullRequest
       1

MySQL Rolling Count of Rows

0 голосов
/ 06 сентября 2018

Я пытаюсь сделать непрерывный подсчет роста регистрации на студенческом сайте.

Запрос выглядит следующим образом:

SELECT COUNT(type) as student_count, MONTH(created_at) as month, YEAR(created_at) as year
FROM users
WHERE type = 'student'
GROUP BY MONTH(created_at), YEAR(created_at)
ORDER BY year, month

Это дает следующий вывод: enter image description here

Что я пытаюсь достичь в запросе, так это продолжать складывать student_counts из предыдущих строк.

Итак:

В декабре 2014 года должно быть 15 учеников

в январе 2015 года должно быть 16 учеников

В феврале 2015 года должно быть 34 ученика

и так далее ...

Возможно ли это в SQL или лучше делать это при выводе данных в самом коде?

Ответы [ 4 ]

0 голосов
/ 06 сентября 2018

Попробуйте это:

SELECT @cumulative := 0;
SELECT @cumulative := @cumulative + student_count student_count,
       month, year
FROM (
    SELECT COUNT(type) as student_count,
           MONTH(created_at) as month,
           YEAR(created_at) as year
    FROM users
    WHERE type = 'student'
    GROUP BY MONTH(created_at), YEAR(created_at)
) A ORDER BY year, month
0 голосов
/ 06 сентября 2018

Попробуйте использовать с накопительным пакетом

SELECT COUNT(type) as student_count, MONTH(created_at) as month, YEAR(created_at) as year
FROM users
WHERE type = 'student'
GROUP BY YEAR(created_at), MONTH(created_at) WITH ROLLUP 
0 голосов
/ 06 сентября 2018

Один подход для обработки этого в MySQL использует коррелированный подзапрос для поиска промежуточного итога.

SELECT DISTINCT
    (SELECT COUNT(*) FROM users u2
     WHERE DATE_FORMAT(u2.created_at, '%Y-%m') <=
           DATE_FORMAT(u1.created_at, '%Y-%m')) AS student_count,
    DATE_FORMAT(created_at, '%Y-%m') AS ym
FROM users u1
WHERE type = 'student'
ORDER BY DATE_FORMAT(created_at, '%Y-%m');

Демо

Здесь не так много объяснений, за исключением того, что SELECT DISTINCT дает нам каждое уникальное значение года-месяца в таблице как отдельную запись. Затем мы подсчитываем все строки в этот момент времени или раньше, чтобы найти промежуточный итог.

0 голосов
/ 06 сентября 2018
select *, @sum := @sum + student_count as sum
from
(
    SELECT YEAR(created_at) as year, 
           MONTH(created_at) as month, 
           COUNT(type) as student_count
    FROM users
    WHERE type = 'student'
    GROUP BY year, month
    ORDER BY year, month
) tmp
CROSS JOIN (select @sum := 0) s
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...