Mysql 选择数据范围,从第一次出现到最后一次出现
从这样的桌子上Mysql 选择数据范围,从第一次出现到最后一次出现,mysql,Mysql,从这样的桌子上 ---------------------------------- | 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 |
----------------------------------
| 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 |
表中没有唯一的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')
如果要将上述查询应用于涉及多个用户
值的数据,则必须在子查询中使用相关性,以便获得每个用户的MIN
和MAX
:
或者,您可以使用内部联接
:
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
您可以使用以下查询:
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')
如果要将上述查询应用于涉及多个用户
值的数据,则必须在子查询中使用相关性,以便获得每个用户的MIN
和MAX
:
或者,您可以使用内部联接
:
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
@HernánEche相应地修改了您的问题。@HernánEche没有考虑用户,这是什么意思?我的意思是您从绝对时间戳中选择最小值和最大值,但不是相对于用户id@HernánEche您是否也可以检查备选方案,并告诉我它与第一个解决方案在性能方面的比较情况?它运行正常,我无法测试哪个更快,两者的数据大小似乎相似,如果以后我能分辨出来,我会回到comment@HernánEche相应地修改您的问题。@HernánEche没有考虑用户,这是什么意思?我的意思是您从绝对时间戳中选择最小值和最大值,但不是相对于用户id@HernánEche您是否也可以检查替代方案,并告诉我它在性能方面与第一个解决方案?它运行正常,我无法测试哪一个更快,两者的数据大小似乎相似,如果稍后我能区分,我将返回comment@Strawberry你说得对,还有其他原因users@Strawberry你说得对,还有其他用户