我正在使用 postgreSQL,我有两个表,一个是用户,一个是用户任务。
用户有以下字段:userid, username
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 万个任务,我正在寻找最快的方法..
最佳答案
您需要将 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
关于sql - 除了在一个查询中的子查询之外,我如何运行它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33690034/