SELECT actioned_by, COUNT(*)
FROM (
SELECT actioned_by, date_trunc('day', t_actioned)
FROM history
JOIN user ON id = actioned_by
WHERE t_actioned BETWEEN t_registered AND t_registered + interval '30 days'
GROUP BY actioned_by, date_trunc('day', t_actioned)
) sub
GROUP BY actioned_by
Итак, во-первых, вы сказали, что хотите получить количество различных дней, поэтому вы должны группировать по date_trunc, иначе вы будете считать несколько событий в один и тот же день (если они существуют).
Что делает этот запрос, присоединитесь к user
, чтобы получить зарегистрированную временную метку для каждого пользователя, убедитесь, что t_actioned
находится в пределах 30 дней с момента регистрации, затем сгруппируйте по пользователю и уникальной дате, и, наконец, посчитайте по каждому пользователю.
Если вы хотите включить пользователей без каких-либо действий, вы можете слегка изменить их: выберите из таблицы пользователей и оставьте историю соединений:
SELECT id, COUNT(*)
FROM (
SELECT id, date_trunc('day', t_actioned)
FROM user
LEFT JOIN history
ON id = actioned_by
AND t_actioned BETWEEN t_registered AND t_registered + interval '30 days'
GROUP BY id, date_trunc('day', t_actioned)
) sub
GROUP BY id