如何用SQL统计单日非连续学生ID的唯一登录累计计数
实现单日首次登录学生的累计计数SQL方案
这个需求的核心是只对每个学生单日的首次登录做累计,重复登录不增加计数,我分两种常用场景给你提供SQL实现:
场景1:仅展示首次登录记录及累计计数
假设你的登录日志表名为login_logs,包含字段student_id(学生ID)和login_time(登录时间)。我们先通过CTE筛选出每个学生单日的首次登录,再用窗口函数做累计:
WITH daily_first_logins AS ( -- 第一步:获取每个学生单日的首次登录时间 SELECT student_id, MIN(login_time) AS first_login_time FROM login_logs -- 可选:如果要指定某一天,添加WHERE条件 -- WHERE DATE(login_time) = '2024-05-20' GROUP BY student_id, DATE(login_time) ) -- 第二步:按首次登录时间排序,累计计数 SELECT student_id, first_login_time, SUM(1) OVER(ORDER BY first_login_time) AS `Count` FROM daily_first_logins ORDER BY first_login_time;
场景2:保留所有登录记录,显示当前累计计数
如果需要保留原日志中的所有登录记录(包括重复登录),同时显示到该时间点为止的累计首次登录学生数,可以用关联查询实现:
WITH daily_first_logins AS ( SELECT student_id, DATE(login_time) AS login_date, MIN(login_time) AS first_login_time FROM login_logs GROUP BY student_id, DATE(login_time) ), cumulative_stats AS ( -- 先算出每个首次登录对应的累计数 SELECT student_id, login_date, first_login_time, SUM(1) OVER(ORDER BY first_login_time) AS running_count FROM daily_first_logins ) -- 关联原日志表,给每条登录记录匹配对应的累计数 SELECT ll.student_id, ll.login_time, cs.running_count AS `Count` FROM login_logs ll JOIN cumulative_stats cs ON ll.student_id = cs.student_id AND DATE(ll.login_time) = cs.login_date ORDER BY ll.login_time;
示例效果
假设原日志数据如下:
| student_id | login_time |
|---|---|
| A | 2024-05-20 08:00:00 |
| B | 2024-05-20 08:30:00 |
| A | 2024-05-20 09:15:00 |
| C | 2024-05-20 10:00:00 |
运行场景2的SQL后会得到:
| student_id | login_time | Count |
|---|---|---|
| A | 2024-05-20 08:00:00 | 1 |
| B | 2024-05-20 08:30:00 | 2 |
| A | 2024-05-20 09:15:00 | 2 |
| C | 2024-05-20 10:00:00 | 3 |
完全符合你要的“首次登录计数增加,重复登录计数不变”的需求。
内容的提问来源于stack exchange,提问作者leaner007
相关产品推荐
相关产品推荐

