如何查找连续登录的日期

how to find consecutive day for login

我的数据库中有 table (MySQL 5.7.36),我试图找到连续的一天 有条件

如果连续一天 > 7

连续一天将被设置为零

DATE_SERV
2022-01-01
2022-01-02
2022-01-03
2022-01-05
2022-01-06
2022-01-09
2022-01-10
2022-01-11

我的实际期望 table 是

DATE_SERV day_consecutive
2022-01-01 1
2022-01-02 2
2022-01-03 3
2022-01-05 1
2022-01-06 2
2022-01-09 1
2022-01-10 2
2022-01-11 3
2022-01-12 4
2022-01-13 5
2022-01-14 6
2022-01-15 7
2022-01-16 1
2022-01-17 2

我之前写过这个,以为你在使用 MySQL 8.x(支持 window functions,不幸的是 5.x 不支持)。无论如何,只是张贴它以防它对其他人有用......


您可以采用此博客 Gaps and Islands Across Date Ranges 中的方法。首先确定“岛屿”或连续日期组

SELECT
        DATE_SERV
        , SUM( IF( DATEDIFF(DATE_SERV, Prev_Date) = 1, 0, 1) ) OVER(
                   ORDER BY DATE_SERV 
        )  AS DateGroup_Num
FROM
      (
         SELECT DATE_SERV
                , LAG(DATE_SERV,1) OVER (
                       ORDER BY DATE_SERV
                ) AS Prev_Date
         FROM   YourTable
      ) grp

产生这个结果:

DATE_SERV DateGroup_Num
2022-01-01 1
2022-01-02 1
2022-01-03 1
2022-01-05 2
2022-01-06 2
2022-01-09 3
2022-01-10 3
2022-01-11 3

然后使用条件 SUM(...) 查找每组的最早日期,并显示自该日期以来的连续天数:

SELECT 
       t.DATE_SERV
       , DATEDIFF( 
            t.DATE_SERV
            , MIN(t.DATE_SERV) OVER( 
                  PARTITION BY t.DateGroup_Num 
                  ORDER BY t.DATE_SERV 
             )
        ) +1 AS Consecutive_Days
FROM ( 
        SELECT
               DATE_SERV
              , SUM( IF( DATEDIFF(DATE_SERV, Prev_Date) = 1, 0, 1) ) OVER(
                    ORDER BY DATE_SERV 
                )  AS DateGroup_Num
        FROM
        (
                SELECT DATE_SERV
                       , LAG(DATE_SERV,1) OVER (
                            ORDER BY DATE_SERV
                         ) AS Prev_Date
                FROM   YourTable
        ) grp
    ) t

结果:

DATE_SERV Consecutive_Days
2022-01-01 1
2022-01-02 2
2022-01-03 3
2022-01-05 1
2022-01-06 2
2022-01-09 1
2022-01-10 2
2022-01-11 3

db<>fiddle here