sql - 除了在一个查询中的子查询之外,我如何运行它?

标签 sql postgresql join group-by

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

最佳答案

您需要将 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

关于sql - 除了在一个查询中的子查询之外,我如何运行它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33690034/

相关文章:

mysql:涉及日历表的RIGHT JOIN查询速度问题

MYSQL 在一列上插入忽略

sql - 相交的日期

sql - 在 PostgreSQL 中为每个客户选择最后两条记录

javascript - sequelize 多对多 setter 不存在

mysql,SQL 内连接内部结构

mysql - MySQL 中 Group By 查询中的子组

mysql - 选择具有各自值的不同列名称

sql - 按期间对月份进行分类

mysql - 多个 MySQL 连接的问题