如何查找连续登录的日期
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
我的数据库中有 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