这题很经典,已经归入错题本。
1. 题目
-
题目描述
写出一个sql语句查询每个日期登录新用户个数,并且查询结果按照日期升序排序 -
一张表
-
所需结果
2. 题解
思路:
对日期进行分组,并统计新用户的数量。
关于新用户,有两种思考:
① 可以理解为在当前日期之前没有出现过的user_id
(自己想到的做法)
② 最小日期对应的 user_id
(大多数人的做法)
代码分别如下:
SELECT date,
SUM(IF(l1.user_id IN (
SELECT l2.user_id
FROM login l2
WHERE l2.date < l1.date ),
0,
1)
) new
FROM login l1
GROUP BY l1.date
ORDER BY l1.date ASC
# 另解(最小日期对应的user_id)
select date,
sum(case when (user_id,date) in (select user_id,
min(date)
from login
group by user_id)
then 1
else 0
end
) new
from login
group by date
order by date;
3. 小结
计数神器:SUM(IF)
或者 SUM(CASE WHEN)
(不要总是想到COUNT
)
这题主要考察条件语句,刚开始做的时候就没有把这个逻辑想清楚,得出了下面不完整的求解(没有考虑新用户为0的情况)
# 错误写法(结果考虑的不全面:没有考虑新用户为0的情况)
SELECT date,
COUNT(DISTINCT user_id) new
FROM login l1
WHERE user_id NOT IN (
SELECT user_id
FROM login l2
WHERE l2.date < l1.date)
GROUP BY date
ORDER BY date
# 错误输出(少了两行新用户为0的数据):
# 2020-10-12|3
# 2020-10-14|1
# 正确输出
# 2020-10-12|3
# 2020-10-13|0
# 2020-10-14|1
# 2020-10-15|0