如何根据时间间隔生成序列号

时间:2018-04-19 05:38:40

标签: mysql sql session sequence

我有以下数据:

---------------------------------------------------------
| IDUSER  | ACCESS_TIME            | IPLOG    | SESSIONX    |
---------------------------------------------------------
|1        |  2018-02-05 04:01:17   |  1.2.3.4 |             |
|1        |  2018-02-05 04:05:00   |  1.2.3.4 |             |
|1        |  2018-02-05 04:40:00   |  1.2.3.4 |             |
|1        |  2018-02-05 07:00:14   |  1.2.3.4 |             |
|1        |  2018-02-05 07:50:14   |  1.2.3.5 |             |
|2        |  2018-02-05 08:20:20   |  1.2.3.5 |             |
|2        |  2018-02-05 08:35:00   |  1.2.3.5 |             |
|2        |  2018-02-05 08:45:20   |  1.2.3.6 |             |
|2        |  2018-02-05 09:35:00   |  1.2.3.6 |             |

目标是知道多少次(SESSIONX) 用户日志基于IDUSER,ACCESS_TIME,IPLOG。 遵守以下规则:

  • 新会话增加(+1)如果每隔30分钟(> 30分钟)访问一次,但使用相同的iplog

  • 如果使用iplog的用户访问权限不同(新),即使不到30分钟(<30分钟) 从上一次开始计算新会话(+1)。

如何使用上述规则查询会话时间序列? ,所以输出如下

---------------------------------------------------------
| IDUSER  | ACCESS_TIME            | IPLOG    | SESSIONX    |
---------------------------------------------------------
|1        |  2018-02-05 04:01:17   |  1.2.3.4 | 1            |
|1        |  2018-02-05 04:05:00   |  1.2.3.4 | 1            |
|1        |  2018-02-05 04:40:00   |  1.2.3.4 | 2            |
|1        |  2018-02-05 07:00:14   |  1.2.3.4 | 3            |
|1        |  2018-02-05 07:50:14   |  1.2.3.5 | 4            |
|2        |  2018-02-05 08:20:20   |  1.2.3.5 | 1            |
|2        |  2018-02-05 08:35:00   |  1.2.3.5 | 1            |
|2        |  2018-02-05 08:45:20   |  1.2.3.6 | 2            |
|2        |  2018-02-05 09:35:00   |  1.2.3.6 | 3            |

1 个答案:

答案 0 :(得分:0)

SELECT IDUSER,
       ACCESS_TIME,
       IPLOG,
       SESSIONX
FROM
(SELECT 
T.IDUSER,
T.ACCESS_TIME,
T.IPLOG,
TIMESTAMPDIFF(MINUTE,@date,T.ACCESS_TIME),
CASE WHEN @id != T.IDUSER THEN @num := 1 END,
CASE WHEN @iplog != T.IPLOG OR TIMESTAMPDIFF(MINUTE,@date,T.ACCESS_TIME) > 30 
THEN @num := @num + 1 
ELSE
@num
END AS SESSIONX,
@date := T.ACCESS_TIME AS VarDate,
@id := T.IDUSER AS VarIDUSER,
@iplog := T.IPLOG AS VarIPLOG
FROM
Table1 T,(SELECT @num := 1,@date := null,@id := null,@iplog := null) R)T1

<强>输出

IDUSER  ACCESS_TIME         IPLOG     SESSIONX
1   2018-02-05T04:01:17Z    1.2.3.4   1
1   2018-02-05T04:05:00Z    1.2.3.4   1
1   2018-02-05T04:40:00Z    1.2.3.4   2
1   2018-02-05T07:00:14Z    1.2.3.4   3
1   2018-02-05T07:50:14Z    1.2.3.5   4
2   2018-02-05T08:20:20Z    1.2.3.5   1
2   2018-02-05T08:35:00Z    1.2.3.5   1
2   2018-02-05T08:45:20Z    1.2.3.6   2
2   2018-02-05T09:35:00Z    1.2.3.6   3

<强>演示

  

http://sqlfiddle.com/#!9/44063e/42