SQL练习69:牛客每个人最近的登录日期(四)

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_idMIN(date)

SELECT user_id, MIN(date)
FROM login
GROUP BY user_id

再在login表中查询user_idMIN(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表与之前获得的数据表左外连接,使用ifnullnull转为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

猜你喜欢

转载自blog.csdn.net/qq_43965708/article/details/113800329