这道题的关键在于利用sum() over()函数求出分组的累计求和值。按照name分组,按照date累计求和。
其次,对于登录但是未做题的人不显示0记录,因此需要将passing表作为主表。

SELECT u.name u_n,l.date DATE, IFNULL(SUM(p_n.number) over(PARTITION BY u.name ORDER BY l.date),0) ps_num
FROM login l
RIGHT JOIN passing_number p_n
ON l.user_id = p_n.user_id AND l.date = p_n.date
INNER JOIN user u
ON l.user_id = u.id
GROUP BY l.user_id,l.date
ORDER BY DATE ASC, u_n ASC