描述
牛客每天有很多人登录,请你统计一下牛客每个日期登录新用户个数,
有一个登录(login)记录表,简况如下:
| id | user_id | client_id | date |
|---|---|---|---|
| 1 | 2 | 1 | 2020-10-12 |
| 2 | 3 | 2 | 2020-10-12 |
| 3 | 1 | 2 | 2020-10-12 |
| 4 | 2 | 2 | 2020-10-13 |
| 5 | 1 | 2 | 2020-10-13 |
| 6 | 3 | 1 | 2020-10-14 |
| 7 | 4 | 1 | 2020-10-14 |
| 8 | 4 | 1 | 2020-10-15 |
第1行表示user_id为2的用户在2020-10-12使用了客户端id为1的设备登录了牛客网,因为是第1次登录,所以是新用户
。。。
第4行表示user_id为2的用户在2020-10-13使用了客户端id为2的设备登录了牛客网,因为是第2次登录,所以是老用户
。。
最后1行表示user_id为4的用户在2020-10-15使用了客户端id为1的设备登录了牛客网,因为是第2次登录,所以是老用户
请你写出一个sql语句查询每个日期登录新用户个数,并且查询结果按照日期升序排序,上面的例子查询结果如下:
| date | new |
|---|---|
| 2020-10-12 | 3 |
| 2020-10-13 | 0 |
| 2020-10-14 | 1 |
| 2020-10-15 | 0 |
查询结果表明:
2020-10-12,有3个新用户(user_id为2,3,1)登录
2020-10-13,没有新用户登录
2020-10-14,有1个新用户(user_id为4)登录
2020-10-15,没有新用户登录
输入:
drop table if exists login;
CREATE TABLE `login` (
`id` int(4) NOT NULL,
`user_id` int(4) NOT NULL,
`client_id` int(4) NOT NULL,
`date` date NOT NULL,
PRIMARY KEY (`id`));
INSERT INTO login VALUES
(1,2,1,'2020-10-12'),
(2,3,2,'2020-10-12'),
(3,1,2,'2020-10-12'),
(4,2,2,'2020-10-13'),
(5,1,2,'2020-10-13'),
(6,3,1,'2020-10-14'),
(7,4,1,'2020-10-14'),
(8,4,1,'2020-10-15');
输出:
2020-10-12|3
2020-10-13|0
2020-10-14|1
2020-10-15|0
我的解题思路:
本题的核心就是找出哪些是新用户登录记录,很显然每个用户最早登录的时间就是新用户
直接使用row_number窗口函数即可
完整通关代码:
select date,
sum(num) as new
from (select user_id
, date
, if(row_number() over (partition by user_id order by date ) = 1, 1, 0) as num
from login) t
group by date
;