Вам нужно будет разбить размер когорты на собственный подзапрос или CTE, чтобы рассчитать общее количество отдельных пользователей, которые были созданы в течение месяца, соответствующего базовому месяцу когорты.
Я подошел к этому рассортировав пользователей по месяцам, когда они были созданы, с помощью функции date_trunc('Month', <date>, <date>)
, но вы можете sh подойти к ней по-разному в зависимости от специфики c бизнес-логики c, которая генерирует ваши когорты.
Я не работаю с Periscope, поэтому приведенный ниже пример запроса структурирован для чистого Redshift, но, надеюсь, его легко перевести в ожидаемый формат Periscope:
WITH cohort_sizes AS (
SELECT date_trunc('Month', created)::DATE AS cohort_month
, COUNT(DISTINCT(id)) AS cohort_size
FROM user_cache u
GROUP BY 1
),
cohort_transactions AS (
SELECT date_trunc('Month', created)::DATE AS cohort_month
, createdon
, owner
, type
, status
, amount_in_dollars
, id
, created
FROM transaction_cache t
LEFT JOIN user_cache u ON t.owner = u.id
WHERE t.type = 'savings'
AND t.status = 'successful'
AND u.created > '2017-01-01'
)
SELECT SUM(t.amount_in_dollars) / s.cohort_size AS Avg_Successful_Transacted
, (datediff(MONTH, u.created, t.createdon)) AS Cohort
, u.created AS Months
, count(DISTINCT u.id) AS Users
FROM cohort_transactions t
JOIN cohort_sizes s ON t.cohort_month = s.cohort_month
LEFT JOIN user_cache AS u ON t.owner = u.id
GROUP BY s.cohort_size, Cohort, Months
ORDER BY Cohort, Months
;