You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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_idlogin_time
A2024-05-20 08:00:00
B2024-05-20 08:30:00
A2024-05-20 09:15:00
C2024-05-20 10:00:00

运行场景2的SQL后会得到:

student_idlogin_timeCount
A2024-05-20 08:00:001
B2024-05-20 08:30:002
A2024-05-20 09:15:002
C2024-05-20 10:00:003

完全符合你要的“首次登录计数增加,重复登录计数不变”的需求。

内容的提问来源于stack exchange,提问作者leaner007

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 18:55:14