登录队列数月

时间:2016-08-15 22:05:26

标签: sql postgresql

我有2个表(用户,登录)。我想创建一个查询,以便在4月中提取用户create_date和logins create_date的用户。然后我想看看有多少这些用户在may中登录了create_date。 (登录群组)

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

2 个答案:

答案 0 :(得分: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' ; 

答案 1 :(得分: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

逐步完成查询。

  • 将用户表加入登录,但只加入4月创建的登录名。可
  • 在聚合中使用案例陈述来计算为4月和4月创建的登录次数。可
  • 在having子句中使用与April相同的条件聚合语句,将记录减少为仅在4月创建用户和登录的记录。