Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL按时间段分组_Mysql - Fatal编程技术网

MySQL按时间段分组

MySQL按时间段分组,mysql,Mysql,我有一个具有以下架构的活动日志: visitor_id, metadata, timestamp 第一个字段是访问者id,第二个字段是给定活动的元数据,最后一个字段是活动发生时的unix时间戳 现在,我想从这个日志中识别各个会话。就是,;我想为每个访问者分组所有行,其中时间戳与前一行或后一行的时间间隔不超过x秒,例如20*60,持续20分钟 如何做到这一点?您可以创建如下自定义组: SELECT t.visitor_id, MIN(t.timestamp), MAX(t

我有一个具有以下架构的活动日志:

visitor_id, metadata, timestamp
第一个字段是访问者id,第二个字段是给定活动的元数据,最后一个字段是活动发生时的unix时间戳

现在,我想从这个日志中识别各个会话。就是,;我想为每个访问者分组所有行,其中时间戳与前一行或后一行的时间间隔不超过x秒,例如20*60,持续20分钟


如何做到这一点?

您可以创建如下自定义组:

SELECT
    t.visitor_id,
    MIN(t.timestamp),
    MAX(t.timestamp)
FROM (
    SELECT
        IF(@lt < l.`timestamp` - 60*20 OR l.visitor_id != @lv, @g := @g + 1, @g) as g,
        @lv := l.visitor_id,
        @lt := l.`timestamp`,
        l.*
    FROM your_log l
    JOIN (SELECT @g := 1, @lt = 0, @lv = NULL) as init
    ORDER BY l.visitor_id, l.`timestamp`
) as t
GROUP BY t.visitor_id, g

在应用程序逻辑中做可能会更好。我认为在MySQL中做会更好。您需要按访问者和时间戳排序,否则,您的时间戳将根据个人情况错误地继续跨越同一访问者。。。至少这是我在原帖中解释的内容。@DRapp是的,谢谢你。它还需要在用户更改时启动一个新组。。。