如何在一个查询中运行此子查询除外?

时间:2015-11-13 09:58:54

标签: sql postgresql join group-by

我正在使用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万个任务,我正在寻找最快的方法..

1 个答案:

答案 0 :(得分:1)

您需要将havingcase一起使用。

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