2016-11-15 30 views
1

我想将不超过15分钟的行分组。我喜欢看到用户何时登录并进行“会话”。时间差不超过15分钟的组行

Time 
2016-11-15 11:37:34 
2016-11-15 11:35:04 
2016-11-15 11:21:11 
2016-11-15 09:37:22 
2016-11-15 09:27:01 
2016-11-14 21:37:59 
2016-11-14 21:33:35 
2016-11-14 21:31:14 

结果:

Start     End 
2016-11-15 11:21:11 2016-11-15 11:37:34 
2016-11-15 09:27:01 2016-11-15 09:37:22 
2016-11-14 21:31:14 2016-11-14 21:37:59 

这是我当前的查询:

SELECT 
ROUND(UNIX_TIMESTAMP(Time)/900) as Session 
FROM workouts 
GROUP BY Session 
ORDER BY Session DESC 

但它只组是在15分钟之间的所有行。

+0

我不跑的子查询(一)什么是15分钟的时间间隔。我喜欢的是如果最后一行和当前行之间的差异不大于15分钟。我确实更新了这个问题 – user2673664

+0

所有的ID都一样吗?如果是这样,为什么要打扰那个专栏? – Strawberry

+0

@Strawberry我已删除id列。你有什么想法如何解决这个问题? – user2673664

回答

1

你一个GROUP BY在所有后不是......

SELECT x.* 
    FROM my_table x 
    LEFT 
    JOIN my_table y ON y.dt > x.dt 
    AND y.dt <= x.dt + INTERVAL 15 MINUTE 
WHERE y.dt IS NULL; 

编辑:

要回答这个问题修正,你可能会考虑这些方针的东西。它看起来要复杂得多,但事实上,它可能执行更快...

SELECT MIN(dt) start 
    , MAX(dt) end 
    FROM 
    (SELECT dt 
      , CASE WHEN @prev > dt - INTERVAL 15 MINUTE THEN @i:[email protected] ELSE @i:[email protected]+1 END rank 
      , @prev:=dt 
     FROM my_table 
      , (SELECT @i:=0,@prev:=null) vars 
     ORDER 
      BY dt 
    ) a 
GROUP 
    BY rank; 

要看看它是如何工作的,它可能有助于自身

+0

甜!是否有办法获得第一次会议? – user2673664

+0

我想用一个联盟或其他联盟 - 但我建议你编辑你的问题,使其更清晰你以后。 – Strawberry

+0

我刚刚更新了这个问题:) – user2673664