Я не пробовал это в MySQL, но, надеюсь, синтаксис правильный.Если нет, возможно, это укажет вам правильное направление.Во-первых, я часто использую таблицу чисел.Это может быть физическая таблица, состоящая просто из чисел, или это может быть сгенерированная / виртуальная / временная таблица.
SELECT
N.number,
COUNT(DISTINCT UA.user_id)
FROM
Numbers N
INNER JOIN User_Activity UA ON
UA.activity_date > NOW() - INTERVAL 30 + N.number DAY AND
UA.activity_date <= NOW() - INTERVAL N.number DAY
WHERE
N.number BETWEEN 0 AND 30
GROUP BY
N.number
Я не знаком со всем синтаксисом INTERVAL, поэтому, если я ошибся,пожалуйста, дайте мне знать, и я постараюсь исправить это.