题解 | #牛客每个人最近的登录日期(六)#
牛客每个人最近的登录日期(六)
https://www.nowcoder.com/practice/572a027e52804c058e1f8b0c5e8a65b4
这道题目要求我们统计每个用户在牛客网的刷题情况,我们要做的事情如下:
1. 确定总体问题
我们需要统计每个用户在每个日期的累计通过题目数,包括用户的名字,以及截止到某天累计通过的题目总数。我们需要从用户表和刷题记录表中提取数据,使用窗口函数SUM
来计算每个用户的累计通过题目数,并按日期升序排序输出。
2. 分析关键问题
- 连接表:将
user
表和passing_number
表连接起来,以便获取每个用户的刷题信息。 - 计算累计通过题目数:使用窗口函数
SUM
计算每个用户的累计通过题目数。 - 排序输出:按日期升序排列输出结果。
3. 解决每个关键问题的代码及讲解
步骤1:连接表
我们使用JOIN
将user
表和passing_number
表连接起来:
from
passing_number p
join user u on p.user_id = u.id
JOIN user u ON p.user_id = u.id
:通过用户ID连接刷题记录表和用户表。
步骤2:计算累计通过题目数
我们使用窗口函数SUM
计算每个用户的累计通过题目数:
sum(p.number) over (
partition by
u.name
order by
date
) as ps_num
SUM(p.number) OVER (PARTITION BY u.name ORDER BY date) AS ps_num
:计算每个用户的累计通过题目数,按日期升序排列。
SUM(column) OVER ( ORDER BY date_column ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW )
SUM(column):对指定列进行求和。
OVER:定义窗口的范围。
ORDER BY date_column:按日期排序。
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW:指定窗口的范围是从第一行到当前行
步骤3:排序输出
我们按日期升序排列输出结果:
order by
p.date
ORDER BY p.date
:按日期升序排列。
完整代码
select
u.name as u_n,
p.date,
sum(p.number) over (
partition by
u.name
order by
date
) as ps_num
from
passing_number p
join user u on p.user_id = u.id
order by
p.date;
、