我有一个表面上看似简单的问题,但我发现了挑战,因此请求帮助。我有一个包含两列的表格:
table: USERS
USER_ID | LOGGED_IN_DATE
001 | 2015-05-01
002 | 2015-05-01
003 | 2015-05-01
001 | 2015-05-02
...
我需要的是一个查询,它将返回给定周内每天出现的所有ID,例如2015-05-01到2015-05-07。不只是在一周中的任何时间,但每天必须有该用户的记录。我需要最快速,最简洁的查询。有什么想法吗?
我已经尝试过了:
没有成功。
谢谢!
答案 0 :(得分:4)
聚合可能是最简单的方法:
select u.user_id
from users u
where u.LOGGED_IN_DATE >= '2015-05-01' and u.LOGGED_IN_DATE < '2015-05-08'
group by u.user_id
having count(distinct date(u.LOGGED_IN_DATE)) = 7;
如果字段确实是没有时间的日期,那么您不需要date()
子句中的having
函数。
答案 1 :(得分:0)
在考虑之后,我没有尝试做一些复杂的SQL查询,而是问自己每天上网是什么意思。这意味着在给定时间段内唯一日期的数量应该等于7.所以我认为这个查询效果很好:
select sub.user_id, sub.count
FROM (select user_id, count(1) as count from users where logged_in_date >= '2015-05-01' AND logged_in_date < '2015-05-08' group by user_id) sub
where sub.count = 7;
有任何想法/意见吗?
<强>更新强>:
这应该在当天级别处理任意数量的登录:
SELECT DISTINCT user_id, count(1) AS total
FROM (SELECT DISTINCT user_id, logged_in_date
FROM users
WHERE logged_in_date >= '2015-05-01'
AND logged_in_date < '2015-05-08'
ORDER BY logged_in_date) sub
GROUP BY user_id
HAVING total = 7;
和@ Gordon的答案一样:
SELECT u.user_id
FROM users u
WHERE u.LOGGED_IN_DATE >= '2015-05-01'
AND u.LOGGED_IN_DATE < '2015-05-08'
GROUP BY u.user_id
HAVING COUNT(DISTINCT DATE(u.LOGGED_IN_DATE)) = 7;
但我更喜欢他。干得好。