从这样的表
----------------------------------
| User | TimeStamp | Kind|
----------------------------------
| bob |2015-01-19 03:14:16| err |
| bob |2015-01-20 02:07:18| ok | <-- from here |
| bob |2015-01-21 12:07:18| err | |
| bob |2015-01-22 12:08:26| ok | |
| bob |2015-01-22 13:40:04| err | <-- to here |
| bob |2015-01-23 20:07:00| ok |
| tom |2015-01-19 03:14:16| err |
| tom |2015-01-20 02:07:18| ok | <-- from here|
| tom |2015-01-22 13:40:04| err | <-- to here |
| tom |2015-01-23 20:07:00| ok |
如何从 Kind=ok 的第一行到 Kind=err 的最后行
预期结果:
----------------------------------
| User | TimeStamp | Kind|
----------------------------------
| bob |2015-01-20 02:07:18| ok |
| bob |2015-01-21 12:07:18| err |
| bob |2015-01-22 12:08:26| ok |
| bob |2015-01-22 13:40:04| err |
| tom |2015-01-20 02:07:18| ok |
| tom |2015-01-22 13:40:04| err |
表中没有唯一的 id,但时间戳是有序的
编辑:可以有多个用户
最佳答案
您可以使用以下查询:
SELECT User, TimeStamp, Kind
FROM mytable
WHERE TimeStamp BETWEEN (SELECT MIN(TimeStamp)
FROM mytable
WHERE Kind = 'ok')
AND
(SELECT MAX(TimeStamp)
FROM mytable
WHERE Kind = 'err')
如果要将上述查询应用于涉及多个User
值的数据,则必须在子查询中使用相关性,以便获得MIN
和 MAX
每个用户:
SELECT User, TimeStamp, Kind
FROM mytable AS t1
WHERE TimeStamp BETWEEN (SELECT MIN(t2.TimeStamp)
FROM mytable AS t2
WHERE t1.User = t2.User AND t2.Kind = 'ok')
AND
(SELECT MAX(t3.TimeStamp)
FROM mytable AS t3
WHERE t1.User = t3.User AND t3.Kind = 'err')
或者您可以使用INNER JOIN
:
SELECT t1.User, t1.TimeStamp, t1.Kind
FROM mytable AS t1
INNER JOIN (
SELECT User,
MIN(CASE WHEN Kind = 'ok' THEN TimeStamp END) AS ok_time,
MAX(CASE WHEN Kind = 'err' THEN TimeStamp END) AS err_time
FROM mytable
GROUP BY User
) AS t2 ON t1.User = t2.User
WHERE t1.TimeStamp BETWEEN t2.ok_time AND t2.err_time
关于mysql - 选择数据范围,从第一次出现到最后一次出现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35746672/