Проблема расчета когорты с сохранением номера месяца в Redshift - PullRequest
0 голосов
/ 05 апреля 2019

Я пытаюсь рассчитать когорты удержания пользователей в красном смещении по месяцам за последние 9 месяцев.Но я сталкиваюсь с проблемой, когда когорты месяцев в приведенном ниже запросе не переносятся в правильный месяц.

Типы данных, которые я запрашиваю:

userid - varcharactiv-varchar

Вот запрос, который я пытаюсь выполнить:

with by_month as 
(SELECT
userid
DATE_TRUNC('month', cast ("activated" as date)) AS joined_month
FROM customers
GROUP BY 1, 2),

first_month as
(select userid, 
 joined_month,
 FIRST_VALUE(order_month) OVER (PARTITION BY userid ORDER BY 
 joined_month asc rows unbounded preceding) AS first
 FROM by_month),

 months as (select userid,
 joined_month,
 first,
 extract(month from (joined_month - first_month)) as month_number
 from first_month)


SELECT
 first as "cohort",
  SUM(CASE WHEN month_number = '0' THEN 1 ELSE 0 END) AS " Month 0",
  SUM(CASE WHEN month_number = '1' THEN 1 ELSE 0 END) AS " Month 1",
  SUM(CASE WHEN month_number = '2' THEN 1 ELSE 0 END) AS " Month 2",
  SUM(CASE WHEN month_number = '3' THEN 1 ELSE 0 END) AS " Month 3",
  SUM(CASE WHEN month_number = '4' THEN 1 ELSE 0 END) AS " Month 4",
  SUM(CASE WHEN month_number = '5' THEN 1 ELSE 0 END) AS " Month 5",
  SUM(CASE WHEN month_number = '6' THEN 1 ELSE 0 END) AS " Month 6",
  SUM(CASE WHEN month_number = '7' THEN 1 ELSE 0 END) AS " Month 7",
  SUM(CASE WHEN month_number = '8' THEN 1 ELSE 0 END) AS " Month 8",
   SUM(CASE WHEN month_number = '9' THEN 1 ELSE 0 END) AS " Month 9"
  from months
  where first_month >= '2018-08-01'
 GROUP BY 1 
ORDER BY 1 desc 

Когда я возвращаю результаты, я получаю невозможное число для пары когорт:

Например:

Cohort       Month 0  Month 1
'2019-01-01'   95     120

Я немного покопался и обнаружил, что номера месяцев не учитываются правильно. Например, для когорты '2019-01-01 число месяца_ является захватом 0, 1 и 3 правильно, но 2 ошибочно приписывается 1-му месяцу. Любая помощь по исправлению будет очень признательна, спасибо!

1 Ответ

0 голосов
/ 06 апреля 2019

Теперь попробуйте

SELECT userid, joined_month, first_month, month_number FROM months 
WHERE first = '2019-01-01' 

(не стесняйтесь добавлять другие столбцы, чтобы углубиться в проблему), добавьте активированный, order_month и т. Д., Пока не получите правильную ручку в отношении того, что его вызывает.

...