我有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
答案 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
逐步完成查询。