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

如何通过SQL实现每7天重置用户登录的唯一标记

用SQL实现每7天重置用户登录唯一标记的方案

完全可以通过SQL实现这个需求,核心思路是基于用户首次登录的累计天数差,按7天为周期划分窗口,每个周期内的首次登录标记为1,其余为0。

原始表

UserIDdateLoggedDayscumulativeDiff
101/01/2022null
101/02/20221
101/03/20222
101/04/20223
101/05/20224
101/06/20225
101/07/20226
101/08/20227
101/10/20229
101/13/202212
101/15/202214

目标表示例

UserIDdateLoggedIsUniqueDayscumulativeDiff
101/01/20221null
101/02/202201
101/03/202202
101/04/202203
101/05/202204
101/06/202205
101/07/202206
101/08/202217
101/10/202209
101/13/2022012
101/15/2022114
101/16/2022015
101/28/2022127

实现SQL(通用窗口函数版本)

SELECT
    UserID,
    dateLogged,
    DayscumulativeDiff,
    CASE
        -- 首次登录直接标记为1
        WHEN ROW_NUMBER() OVER (PARTITION BY UserID ORDER BY dateLogged) = 1 THEN 1
        -- 对比当前与上一条记录的7天周期分组,不同则标记1
        WHEN FLOOR(COALESCE(DayscumulativeDiff, 0)/7) 
             != FLOOR(COALESCE(LAG(DayscumulativeDiff) OVER (PARTITION BY UserID ORDER BY dateLogged), 0)/7) THEN 1
        ELSE 0
    END AS IsUnique
FROM
    your_table_name
ORDER BY
    UserID, dateLogged;

代码说明

  • ROW_NUMBER() 识别每个用户的首次登录记录,直接标记为1。
  • COALESCE(DayscumulativeDiff, 0) 将首次登录的null天数差转为0,统一周期计算逻辑。
  • FLOOR(DayscumulativeDiff/7) 把累计天数按7天分组:0-6天为组0,7-13天为组1,14-20天为组2,以此类推。
  • LAG(DayscumulativeDiff) 获取上一条登录的累计天数差,若当前记录的分组与上一条不同,说明进入新的7天周期,标记为1。

无DayscumulativeDiff字段的扩展方案

如果表中没有预计算的DayscumulativeDiff,可以通过首次登录日期自行计算:

WITH user_first_login AS (
    SELECT
        UserID,
        MIN(dateLogged) AS first_login_date
    FROM your_table_name
    GROUP BY UserID
)
SELECT
    t.UserID,
    t.dateLogged,
    DATEDIFF(day, u.first_login_date, t.dateLogged) AS DayscumulativeDiff,
    CASE
        WHEN ROW_NUMBER() OVER (PARTITION BY t.UserID ORDER BY t.dateLogged) = 1 THEN 1
        WHEN FLOOR(DATEDIFF(day, u.first_login_date, t.dateLogged)/7)
             != FLOOR(DATEDIFF(day, u.first_login_date, LAG(t.dateLogged) OVER (PARTITION BY t.UserID ORDER BY t.dateLogged))/7) THEN 1
        ELSE 0
    END AS IsUnique
FROM your_table_name t
JOIN user_first_login u ON t.UserID = u.UserID
ORDER BY t.UserID, t.dateLogged;

注:DATEDIFF函数语法因数据库而异,MySQL用DATEDIFF(t.dateLogged, u.first_login_date),Oracle用TRUNC(t.dateLogged) - TRUNC(u.first_login_date),需根据实际数据库调整。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 11:20:30