题解 | #牛客每个人最近的登录日期(六)#

牛客每个人最近的登录日期(六)

https://www.nowcoder.com/practice/572a027e52804c058e1f8b0c5e8a65b4

这道题目要求我们统计每个用户在牛客网的刷题情况,我们要做的事情如下:

1. 确定总体问题

我们需要统计每个用户在每个日期的累计通过题目数,包括用户的名字,以及截止到某天累计通过的题目总数。我们需要从用户表和刷题记录表中提取数据,使用窗口函数SUM来计算每个用户的累计通过题目数,并按日期升序排序输出。

2. 分析关键问题

  • 连接表:将user表和passing_number表连接起来,以便获取每个用户的刷题信息。
  • 计算累计通过题目数:使用窗口函数SUM计算每个用户的累计通过题目数。
  • 排序输出:按日期升序排列输出结果。

3. 解决每个关键问题的代码及讲解

步骤1:连接表

我们使用JOINuser表和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;

全部评论

相关推荐

评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客企业服务