【问题标题】:Group rows where time difference is not bigger than 15 min时差不大于 15 分钟的分组行
【发布时间】:2016-11-15 11:41:06
【问题描述】:

我想对间隔不超过 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 分钟内的所有行进行分组。

【问题讨论】:

  • 我没有 15 分钟的间隔。我喜欢的是如果最后一行和当前行之间的差异不大于 15 分钟。我确实更新了问题
  • 所有的id都一样吗?如果是这样,那为什么还要麻烦那个专栏呢?
  • @Strawberry 我删除了 id 列。你知道如何解决这个问题吗?

标签: mysql time group-by between


【解决方案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:=@i ELSE @i:=@i+1 END rank
            , @prev:=dt 
         FROM my_table
            , ( SELECT @i:=0,@prev:=null ) vars 
        ORDER 
            BY dt
     ) a 
 GROUP 
    BY rank;

要了解它是如何工作的,它可能有助于自己运行子查询 (a)

【讨论】:

  • 甜蜜!有没有办法获得会话的第一次?
  • 我猜是使用 UNION 或其他 JOIN - 但我建议您编辑您的问题,以便更清楚地了解您的目标。
  • ...更难的事情:-)
  • 对不起,伙计 :) 知道如何得到这个吗?
  • 可以问更多关于这个的问题吗?或者我应该在堆栈中创建一个新问题,以便更多人可以获得相同的帮助?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多