时差不大于 15 分钟的行分组
Group rows where time difference is not bigger than 15 min
我想对间隔不超过 15 分钟的行进行分组。我喜欢查看用户何时登录并获得 "session"。
Table
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 分钟之间的所有行进行分组。
你根本不是在使用 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) 本身
我想对间隔不超过 15 分钟的行进行分组。我喜欢查看用户何时登录并获得 "session"。
Table
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 分钟之间的所有行进行分组。
你根本不是在使用 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) 本身