Я хотел бы узнать, сколько у меня лояльных пользователей.Определение таково, что пользователь должен входить в систему как минимум один раз в каждый скользящий месяц.
Если пользователь входил в систему один раз между 2018-08-21 и 2018-09-21, а такжеодин раз между 2018-09-21 и 2018-10-21, а также один раз между 2018-10-21 и 2018-11-21, тогда это лояльный пользователь.
Я думал, что лучше всего достичьто есть присоединиться к этим трем определенным подзапросам.Но я застрял с тем, как считать?Каждый подзапрос показывает различное количество.Должен ли я считать самое низкое значение пересечением?Или я делаю это совершенно неправильно?
select p.country, round(SUM(a.GBytes+b.GBytes+c.GBytes), 2) as `Traffic`, a.Count, b.Count , c.Count
from (
SELECT username,
SUBSTRING_INDEX( callingstationid, '=', 1 ) as IP,
(SUM(`acctinputoctets`)+SUM(`acctoutputoctets`))/1000/1000/1000 as GBytes,
count(username) as Count
FROM radacct
WHERE (`acctstarttime` BETWEEN '2018-08-21 22:13:54.286223' AND '2018-09-21 22:13:54.286223')
GROUP BY username
) a join (
SELECT username,
SUBSTRING_INDEX( callingstationid, '=', 1 ) as IP,
(SUM(`acctinputoctets`)+SUM(`acctoutputoctets`))/1000/1000/1000 as GBytes,
count(username) as Count
FROM radacct
WHERE (`acctstarttime` BETWEEN '2018-09-21 22:13:54.286223' AND '2018-10-21 22:13:54.286223')
GROUP BY username
) b on a.username = b.username
join (
SELECT username,
SUBSTRING_INDEX( callingstationid, '=', 1 ) as IP,
(SUM(`acctinputoctets`)+SUM(`acctoutputoctets`))/1000/1000/1000 as GBytes,
count(username) as Count
FROM radacct
WHERE (`acctstarttime` BETWEEN '2018-10-21 22:13:54.286223' AND '2018-11-21 22:13:54.286223')
GROUP BY username
) c on b.username = c.username
join cache_db.global_ip p on p.ip = a.IP
join cache_db.global_ip p2 on p2.ip = b.IP
join cache_db.global_ip p3 on p3.ip = c.IP
group by country;
Результат: ![enter image description here](https://i.stack.imgur.com/mq6GR.png)