(Рассчитывать на сегодня) минус (рассчитывать на предыдущий день) в течение 1 месяца - PullRequest
1 голос
/ 01 апреля 2019

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

SELECT COUNT(DISTINCT member_profile.memberProfileNumber)
FROM member_profile
LEFT JOIN member_token
ON member_profile.id = member_token.memberProfileId
WHERE member_profile.memberProfileNumber LIKE 'MM%';

У меня есть две таблицы и столбцы, как показано ниже:

Таблица member_profile

memberProfileNumber
id

Таблица member_token

memberProfileId
createdAt

Ожидаемый результат:

Expected Result

Ответы [ 2 ]

0 голосов
/ 01 апреля 2019

Вы можете сделать это с помощью простого соединения

drop table if exists member_profile,member_token;
create table member_profile
(memberProfileNumber int, id int);

create Table member_token
(memberProfileId  int,createdAt date);

insert into member_profile values
(1,1),(2,2),(3,3);
insert into member_token values
(1,'2019-01-01'),(1,'2019-01-01'),
(2,'2019-01-01'),(3,'2019-01-01'),
(1,'2019-01-02'),(2,'2019-01-02'),
(1,'2019-01-03'),(3,'2019-01-03');

select mt.createdat,count(distinct memberprofileid) todayobs,
        y.createdat yesterdaydate,
         max(yesterdayobs) yesterdayobs,
         ifnull(count(distinct memberprofileid),0) -  ifnull(max(yesterdayobs),0) changeonday
from member_token mt
left join
(select createdat,count(distinct memberprofileid) yesterdayobs
    from member_token mt1 
         group by createdat
         ) y on y.createdat = date_sub(mt.createdat, interval 1 day)
group by mt.createdat;

+------------+----------+---------------+--------------+-------------+
| createdat  | todayobs | yesterdaydate | yesterdayobs | changeonday |
+------------+----------+---------------+--------------+-------------+
| 2019-01-01 |        3 | NULL          |         NULL |           3 |
| 2019-01-02 |        2 | 2019-01-01    |            3 |          -1 |
| 2019-01-03 |        2 | 2019-01-02    |            2 |           0 |
+------------+----------+---------------+--------------+-------------+
3 rows in set (0.00 sec)

Примечание 1) Я не определил месяц 2) Решение предполагает, что в таблице member_token есть запись на каждый деньЯ не видел актуальности таблицы member_profile.

0 голосов
/ 01 апреля 2019

Если вы используете MySQL 8.0, вы можете выполнить агрегирование в подзапросе, а затем использовать LAG(...) OVER(...) во внешнем запросе, чтобы получить значение за предыдущий день, например:

SELECT 
    createdAtDay,
    cnt,
    cnt - LAG(cnt) OVER(ORDER BY createdAtDay) cnt_diff
FROM (
    SELECT DATE(mt.createdAt) createdAtDay, COUNT(DISTINCT mf.memberProfileNumber) cnt
    FROM member_profile mf
    INNER JOIN member_token mt 
        ON mf.id = mt.memberProfileId 
        AND mt.createdAt >= NOW() - INTERVAL 1 MONTH
    WHERE mf.memberProfileNumber LIKE 'MM%' AND 
    GROUP BY DATE(createdAt)
) x

NB1: я считаю, что LEFT JOIN member_token должно быть INNER JOIN member_token, поскольку столбец member_token.createdAt используется для агрегирования результатов.

NB2: подзапрос фильтрует токены, созданные за последний месяц.

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