Как получить количество новых подписок и количество продлений подписки в SQL?

#mysql #sql

#mysql #sql

Вопрос:

Наличие этой таблицы, представляющей подписки пользователей:

 CREATE TABLE `subscriptions` (
  `id` int(11) NOT NULL,
  `email` varchar(255) DEFAULT NOT NULL,
  `created_at` datetime NOT NULL
);
  

Может быть несколько записей с одним и тем же адресом электронной почты.

Как я могу получить количество новых подписок в месяц и количество продлений подписки в месяц?

Допустим, подписка была оформлена с помощью электронной почты «aaa@a.com » в июле 2018 года. Если в августе 2018 года будет выполнена другая подписка с «aaa@a.com «, это обновление. Все подписки, которые были сделаны в августе 2018 года, если электронное письмо не зарегистрировано в июле 2018 года, являются новыми подписками.

Комментарии:

1. Пожалуйста, предоставьте примеры данных и желаемые результаты. Что такое «новая подписка»? Что такое «продление подписки»?

2. Я отредактировал вопрос

Ответ №1:

Вы можете сделать это, определив первый раз, когда подписчик просматривается:

 select year(created_at), month(created_at),
       count(*) as num_subscribers,
       sum( min_ca = created_at ) as num_new_subscribers,
       sum( min_ca > created_at ) as num_renewals
from subscriptions s join
     (select email, min(created_at) as min_ca
      from subscriptions s
      group by email
     ) ss
     on s.email = ss.email
group by  year(created_at), month(created_at);
  

Комментарии:

1. Я всегда получаю 0 в num_renewals.

Ответ №2:

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

 select t.cyear, t.cmonth, (t.total - t.renewals) newsubs, t.renewals
  from (
  select 
    year(s.created_at) cyear, month(s.created_at) cmonth, 
    count(*) total,
    sum(
      case when exists (
        select 1 from subscriptions
        where 
          email = s.email and 
          last_day(s.created_at - interval 1 month) = last_day(created_at))
        then 1
        else 0
      end
    ) renewals
  from subscriptions s
  group by year(s.created_at), month(s.created_at)
) t
  

Комментарии:

1. Я получаю сообщение об ошибке: неправильный подсчет параметров при вызове встроенной функции ‘datediff’

2. В datediff есть 3 параметра. Вы скопировали код точно так, как он приведен выше?

3. Да, я использую MySQL

4. Теперь я получаю синтаксическую ошибку рядом с ‘then 1 else 0 end’

5. Спасибо, теперь это работает. У меня вопрос. Учитывает ли это итеративный режим?