我正在使用postgreSQL,我有两个表,一个是用户,一个是usertasks。
用户有以下字段:用户ID,用户名
usertasks有以下字段: id,taskdate,userid
userid和id是上表中的主键
我想找到在过去3个月内完成少于3项任务的所有用户。 我不能在这里使用 WHERE taskdate>(last3months),因为我需要所有用户,而不仅仅是那些在过去3个月内完成任务的用户。 (有些用户可能在6个月前完成了他们的任务,但在过去3个月内没有完成任务,所以我也需要这些用户)
我的疑问是:
select userid
from users
EXCEPT
select userid from usertasks
where usertasks.taskdate > CURRENT_DATE - INTERVAL '3 months'
group by usertasks.userid having count(id) >= 3
问题: 上面的查询完美地运行并返回正确的结果,我也尝试了NOT IN,而不是EXCEPT,它也可以正常工作,但问题是我遇到性能问题,可以在一个查询中完成,而不使用子查询,可以使用连接或任何其他方法完成吗?使用子查询使其变慢。
测试用例是针对10万用户和100万个任务,我正在寻找最快的方法..
答案 0 :(得分:1)
您需要将having
与case
一起使用。
Select u.user_id
from users u
left join usertask ut
on ut.user_id=u.user_id
group by u.user_id
having count(case when ut.taskdate > CURRENT_DATE - INTERVAL '3 months' then task_id else null end)<3 -- count of tasks in last 3 monthx < 3