2016-08-15 2 views
0

У меня есть 2 таблицы (пользователи, логины). Я хотел бы создать запрос, который вытаскивает пользователей, у которых есть пользователи create_date и logins create_date в апреле. Затем я хотел бы посмотреть, сколько из этих пользователей имеет login create_date в may. (Войти Когорта)Войти когорты за месяцы

User_id | create_date 

    1 | 04-05-16 

    2 | 04-08-16 

    3 | 05-05-16 

    4 | 05-06-16 

User_id | login_create_date 

    1 | 04-05-16 

    1 | 05-08-16 

    1 | 05-09-16 

    2 | 04-09-16 

    2 | 05-015-16 

    3 | 05-16-16 

    3 | 05-20-16 

    3 | 05-21-16 

ответ

1

Здесь используется один метод exists:

select count(*) as April_Creates, 
     sum(case when exists (select 1 
          from logins l2 
          where l2.user_id = u.user_id and 
            l2.create_date >= '2016-05-01' and l2.create_date < '2016-06-01' 
          ) 
       then 1 else 0 
      end) as May_Logins 
from users u 
where u.create_date >= '2016-04-01' and u.create_date < '2016-05-01' and 
     exists (select 1 
       from logins l 
       where l.user_id = u.user_id and 
        l.create_date >= '2016-04-01' and l.create_date < '2016-05-01' 
      ); 

Альтернативный метод использует условное агрегацию:

select sum(apr_login) as num_apr_logins, 
     sum(may_login) as num_may_logins, 
     sum(may_login)/1.0 * sum(may_login) as ratio 
from users u join 
    (select user_id, 
      max(case when l.create_date >= '2016-04-01' and l.create_date < '2016-05-01' 
         then 1 else 0 
       end) as apr_login, 
      max(case when l.create_date >= '2016-05-01' and l.create_date < '2016-06-01' 
         then 1 else 0 
       end) as may_login 
     from logins l 
     group by user_id 
     having apr_login = 1 
    ) l 
where u.create_date >= '2016-04-01' and u.create_date < '2016-05-01' ; 
+0

К сожалению, я также должен добавить, что записи в таблице пользователей уникальны, но пользователь может иметь много экземпляров в таблице логинов. Используя свой первый метод, как бы я мог убедиться, что мы только подсчитываем пользователей один раз? – Cletus

+0

@Cletus. , , Первый запрос выбирается только из таблицы 'users', поэтому не может быть дублированных пользователей. –

1

Я поклонник использования соединения слева и условной агрегации а не суб/вложенных выборок для этого случая ...

SELECT 
    u.[User_id] 
    ,u.create_date 
    ,COUNT(CASE WHEN EXTRACT(MONTH FROM l.login_create_date) = 4 THEN 1 END) as AprilLoginsCreated 
    ,COUNT(CASE WHEN EXTRACT(MONTH FROM l.login_create_date) = 5 THEN 1 END) as MayLoginsCreated 
FROM 
    users u 
    LEFT JOIN logins l 
    ON u.[User_id] = l.[User_id] 
    AND EXTRACT(MONTH FROM l.login_create_date) IN (4,5) 
    AND l.login_create_date >= '2016-04-01' 
WHERE 
    EXTRACT(MONTH FROM u.create_date) IN (4) 
    AND u.create_date >= '2016-04-01' 
GROUP BY 
    u.[User_id] 
    ,u.create_date 
HAVING 
    COUNT(CASE WHEN EXTRACT(MONTH FROM l.login_create_date) = 4 THEN l END) > 1 

Итак, шаг за шагом.

  • Присоединяйтесь таблицей пользователей логинов, но только логины, которые где созданы в апреле & мая
  • Используй саз в агрегации для подсчета числа попыток входа, созданных в апреле & мая
  • использовать то же условное агрегирование на апрель в предложении, чтобы уменьшить количество записей, чтобы быть только теми, у кого был пользователь и логин, созданный в апреле.
Смежные вопросы