MySQL Запрос, чтобы получить ежемесячную разницу в данных - PullRequest
0 голосов
/ 11 июля 2020
select * from new_joiner;
+------+--------------+
| id   | date_of_join |
+------+--------------+
|    1 | 2020-01-10   |
|    2 | 2020-01-02   |
|    3 | 2020-01-05   |
|    4 | 2020-02-10   |
|    5 | 2020-02-11   |
|    6 | 2020-07-11   |
|    7 | 2020-07-11   |
|    8 | 2020-07-11   |
|    9 | 2020-07-11   |
|   10 | 2020-07-11   |
|   11 | 2020-05-01   |
|   12 | 2020-05-02   |
|   13 | 2020-05-03   |
|   14 | 2020-05-04   |
|   15 | 2020-05-05   |
|   16 | 2020-05-05   |
|   17 | 2020-05-06   |
+------+--------------+


select   MONTHNAME(date_of_join) as MONTHNAME, 
         count(id) as JOINEE 
from     new_joiner 
where    MONTH(date_of_join)>=1 
group by MONTH(date_of_join);
+-----------+--------+
| MONTHNAME | JOINEE |
+-----------+--------+
| January   |      3 |
| February  |      2 |
| May       |      7 |
| July      |      5 |
+-----------+--------+

Мне нужен запрос, который дает мне ежемесячное изменение данных по сравнению с предыдущим месяцем.

Например: нового участника в январе было 3, а в феврале - 2, поэтому сравните с январем в Февраль месяц -1 присоединился, поэтому запрос должен вывести меня:

+-----------+-------------+
| MONTHNAME | JOINEE_DIFF |
+-----------+-------------+
| February  |          -1 |
| Mar       |          -2 |
| April     |           0 |
| May       |           7 |
| June      |          -7 |
| July      |           5 |
| Aug       |          -5 |
| Sep       |           0 |
| Oct       |           0 |
| Nov       |           0 |
| Dec       |           0 |
+-----------+-------------+

Игнорировать январь, поскольку у него нет предыдущего месяца, и предположим, что у нас есть данные только за данный год, например, 2020. Требовать данные для всех месяцев с февраля по декабрь c.

Ответы [ 2 ]

0 голосов
/ 12 июля 2020

Используйте коррелированный подзапрос, чтобы получить количество участников за предыдущий месяц и вычесть его:

SELECT 
  t.monthname,
  joinee - (SELECT COUNT(*) FROM new_joiner WHERE MONTH(date_of_join) = t.month - 1) JOINEE_DIFF 
FROM (
  SELECT MONTH(date_of_join) month, MONTHNAME(date_of_join) monthname, 
         COUNT(id) joinee 
  FROM new_joiner 
  GROUP BY month, monthname
) t 
WHERE t.month > 1;
0 голосов
/ 11 июля 2020

Предполагая, что у вас есть данные за каждый месяц, вы можете использовать lag():

select MONTHNAME(date_of_join) as MONTHNAME, 
       count(id) as JOINEE,
       (count(*) - lag(count(*)) over (order by  min(date_of_join)) as diff
from new_joiner 
where MONTH(date_of_join) >= 1 
group by MONTH(date_of_join);

Обратите внимание, что использование месяцев без лет чревато опасностями. Кроме того, month() любой правильно сформированной даты должен быть больше 1.

Все это предполагает запрос, более похожий на:

select *
from (select MONTHNAME(date_of_join) as MONTHNAME, 
             count(id) as JOINEE,
             (count(*) - lag(count(*)) over (order by  min(date_of_join)) as diff,
             min(date_of_join) as min_date_of_join
      from new_joiner 
      where date_of_join >= '2020-01-01' and date_of_join < '2021-01-01'
      group by MONTH(date_of_join)
     ) t
where diff is not null
order by min_date_of_join;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...