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 |               | 
| 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值的数据,则必须在子查询中使用相关性,以便获得MINMAX 每个用户:

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/

相关文章:

MySQL IN 子句太慢,无法使 JOIN 正常工作

php比较还是mysql数据?

php - 按字段对结果进行分组,但显示全部结果并按自定义顺序显示

php - 存储数据的奇怪字符编码,旧脚本显示它们很好,新脚本却没有

java - com.mysql.jdbc.exceptions.jdbc4.CommunicationsException :Communications link failure

mysql - 如何在单个查询中连接不同表的多个随机值?

mysql - 用马拉雅拉姆语向 Mysql 插入数据

android - Sql 搜索 > 适用于 Mysql 不适用于 SQLITE

mysql - 如何在 MySQL 中按父子进行 SELECT 和排序

php - POST 空字段导致查询错误