Как я могу сделать знаменатель константой для каждого из чисел в той же строке в SQL? - PullRequest
1 голос
/ 08 января 2020

Я пытаюсь создать таблицу со средним объемом продаж, разделенным на группу пользователей, которые зарегистрировались для учетной записи в определенном месяце, однако я могу только рассчитать, чтобы разделить на количество людей, которые сделали покупка в этом конкретном c месяце, который меньше, чем общая сумма когорты. Как изменить запрос ниже, чтобы каждая из avg_sucessful_transacted сумм делилась на группу 0 для каждого месяца?

спасибо.

select sum (t.amount_in_dollars)/ count (distinct u.id)  as Avg_Successful_Transacted, (datediff(month,[u.created:month],[t.createdon:month])) as Cohort, [u.created:month] as Months,
count (distinct u.id) as Users
from [transaction_cache as t]
left join [user_cache as u] on t.owner = u.id
where t.type = 'savings' and t.status = 'successful' and [u.created:year] > ['2017-01-01':date:year]
group by cohort, months
order by Cohort, Months

1 Ответ

0 голосов
/ 16 января 2020

Вам нужно будет разбить размер когорты на собственный подзапрос или 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
;
...