假设该表有十亿行数据,是否有更好的方法来扩展此问题的解决方案。我有兴趣获得2016年提交请求的所有新用户。
请求(request_id,request_day,user_id,userprofile_id)
SELECT DISTINCT user_id
FROM requests
WHERE EXTRACT( year FROM request_day ) = 2016
AND user_id
NOT IN
( SELECT DISTINCT user_id
FROM requests
WHERE EXTRACT( YEAR FROM request_day ) <> 2016
);
答案 0 :(得分:1)
我会使用以下查询来回答这个问题:
SELECT user_id
FROM requests
GROUP BY user_id
HAVING SUM(CASE WHEN YEAR(request_day) <> 2016 THEN 1 ELSE 0 END) = 0
这只会返回有2016年出现请求且没有其他年份的用户。
答案 1 :(得分:1)
使用EXISTS
通常比IN
更快:
select distinct user_id
from requests r
where extract(year from request_day) = 2016
and not exists (
select 1
from requests
where user_id = r.user_id
and extract(year from request_day) <> 2016
);