Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 选择数据范围,从第一次出现到最后一次出现_Mysql - Fatal编程技术网

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你说得对,还有其他用户