SQL练习69:牛客每个人最近的登录日期4
题目链接:牛客网
题目描述
牛客每天有很多人登录,请你统计一下牛客每个日期登录新用户个数,有一个登录(login)记录表,简况如下:
第1行表示id为2的用户在2020-10-12使用了客户端id为1的设备登录了牛客网,因为是第1次登录,所以是新用户
。。。
第4行表示id为2的用户在2020-10-13使用了客户端id为2的设备登录了牛客网,因为是第2次登录,所以是老用户
。。
最后1行表示id为4的用户在2020-10-15使用了客户端id为1的设备登录了牛客网,因为是第2次登录,所以是老用户
请你写出一个sql语句查询每个日期登录新用户个数,并且查询结果按照日期升序排序,上面的例子查询结果如下:
查询结果表明:
2020-10-12,有3个新用户(id为2,3,1)登录
2020-10-13,没有新用户登录
2020-10-14,有1个新用户(id为4)登录
2020-10-15,没有新用户登录
解法
根据题目的要求,查询user_id
和MIN(date)
。
SELECT user_id, MIN(date)
FROM login
GROUP BY user_id
再在login
表中查询user_id
和MIN(date)
对应的数据,统计user_id
的数目。
SELECT date, COUNT(user_id) new
FROM login
WHERE (user_id, date) in (SELECT user_id, MIN(date)
FROM login
GROUP BY user_id)
GROUP BY date
此时的结果还缺少一些登陆人数为0的日期。
之后将login
表与之前获得的数据表左外连接,使用ifnull
将null
转为0,再通过date
分组,date
排序即可。
SELECT l.date, ifnull(new, 0)
FROM login l LEFT JOIN (SELECT date, COUNT(user_id) new
FROM login
WHERE (user_id, date) in (SELECT user_id, MIN(date)
FROM login
GROUP BY user_id)
GROUP BY date) r
ON l.date = r.date
GROUP BY l.date
ORDER BY l.date