【问题标题】:How to generate sequence numbers based on time intervals如何根据时间间隔生成序列号
【发布时间】:2018-04-19 05:38:39
【问题描述】:

我有以下数据:

-------------------------------------------------- -------- |用户名 |访问时间 |网络日志 |会议 | -------------------------------------------------- -------- |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 的用户日志。 遵循以下规则:

  • 如果新会话的访问时间间隔超过 30 分钟(> 30 分钟)但使用相同的 iplog,则会增加 (+1)

  • 如果使用 iplog 的用户访问不同(新),即使在 30 分钟以下(

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

-------------------------------------------------- -------- |用户名 |访问时间 |网络日志 |会议 | -------------------------------------------------- -------- |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 |

【问题讨论】:

  • 使用用户定义的变量。一个变量保存最后一个IDUSER,另一个保存最后一个ACCESS_TIME,另一个保存最后一个IPLOG,最后一个保存SESSIONX。您可以根据当前行中的列与保存的变量的比较情况来增加或重置 SESSIONX
  • StackOverflow 不是免费的编码服务。所以希望你try to solve your own problem first。请更新您的问题以在minimal reproducible example 中显示您已经尝试过的内容。如需更多信息,请参阅How to Ask,并拨打tour :) 我希望我的评论足以让您朝着正确的方向前进。
  • 查看stackoverflow.com/questions/44059853/… 了解变量的类似用法。

标签: mysql sql session sequence


【解决方案1】:
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

【讨论】:

    猜你喜欢
    • 2012-07-23
    • 1970-01-01
    • 1970-01-01
    • 2012-05-28
    • 1970-01-01
    • 1970-01-01
    • 2020-11-26
    • 2018-04-22
    • 2021-01-20
    相关资源
    最近更新 更多