获取2016年提交请求的所有新用户

时间:2016-10-28 03:45:36

标签: mysql sql postgresql

假设该表有十亿行数据,是否有更好的方法来扩展此问题的解决方案。我有兴趣获得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 
  );

2 个答案:

答案 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
    );