MySQL从一系列相同的值中选择第一条和最后一条记录

Posted

技术标签:

【中文标题】MySQL从一系列相同的值中选择第一条和最后一条记录【英文标题】:MySQL select first and last records from a series of same value 【发布时间】:2013-05-14 10:26:25 【问题描述】:

我有一张这样的桌子

Id    Status        TimeStamp
1        1     2012-02-03 00:00:05
2        1     2012-02-03 00:00:10
3        0     2012-02-03 00:00:15
4        0     2012-02-03 00:00:20
5        0     2012-02-03 00:00:25
6        1     2012-02-03 00:00:30
7        1     2012-02-03 00:00:35
8        1     2012-02-03 00:00:40
9        0     2012-02-03 00:00:45
10       1     2012-02-03 00:00:50

我正在使用 mysql。 我需要的是一个 sql 查询或存储过程,它只选择具有 ID 的行(1、2、3、5、6、8、9、10)。即,在按时间戳排序后,我需要一系列相同“状态”记录中的第一条和最后一条记录。这实际上可行吗?救命!!!

【问题讨论】:

那么ID=1 也应该出现在您的预期结果中,因为它是一系列相同状态 中的第一个记录。 (如果我很好地理解了你的问题) 是的。相应地修改了 qn 【参考方案1】:
DROP TABLE IF EXISTS my_table;
CREATE TABLE my_table 
(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
,status        TINYINT NOT NULL
,TimeStamp TIMESTAMP NOT NULL
);

INSERT INTO my_table VALUES
(1        ,1     ,'2012-02-03 00:00:05'),
(2        ,1     ,'2012-02-03 00:00:10'),
(3        ,0     ,'2012-02-03 00:00:15'),
(4        ,0     ,'2012-02-03 00:00:20'),
(5        ,0     ,'2012-02-03 00:00:25'),
(6        ,1     ,'2012-02-03 00:00:30'),
(7        ,1     ,'2012-02-03 00:00:35'),
(8        ,1     ,'2012-02-03 00:00:40'),
(9        ,0     ,'2012-02-03 00:00:45'),
(10       ,1     ,'2012-02-03 00:00:50');

SELECT a.id start
     , MIN(c.id) End 
  FROM my_table a
  LEFT 
  JOIN my_table b 
    ON b.status = a.status
   AND b.id = a.id - 1
  LEFT 
  JOIN my_table c 
    ON c.status = a.status
   AND c.id >= a.id  
  LEFT 
  JOIN my_table d 
    ON d.status = a.status
   AND d.id = c.id + 1
 WHERE b.id IS NULL 
   AND c.id IS NOT NULL
   AND d.id IS NULL
 GROUP 
    BY a.id; 

+-------+------+
| start | End  |
+-------+------+
|     1 |    2 |
|     3 |    5 |
|     6 |    8 |
|     9 |    9 |
|    10 |   10 |
+-------+------+

这是一个fiddle

【讨论】:

实际上我为什么只选择特定记录是因为性能。我的表将有数百万条记录。对不起,我之前没有提到这一点.. 幸好这个查询真的很快! 不幸的是,查询耗时 600 秒,mysql 针对 200 万条记录超时。 从 mytable 中选择 ID、状态、时间戳,其中 Timestamp='xxx' asc 限制为 1,10。还是我在这里的问题中遗漏了什么? @AbhilashCherukat 好吧,您已经晚了大约 2 年,并且错过了问题的全部要点。除此之外,请继续努力。

以上是关于MySQL从一系列相同的值中选择第一条和最后一条记录的主要内容,如果未能解决你的问题,请参考以下文章

如何使用聚合函数在 MySQL 查询中获取分组记录的第一条和最后一条记录?

如何使用聚合函数在 MySQL 查询中获取分组记录的第一条和最后一条记录?

在分组结果中选择第一条和最后一条记录 - Oracle 11g

如何从 sql 查询中获取第一条和最后一条记录?

GL VBO 问题:第一条和最后一条三角形没有正确显示

获取表中存在的每个日期的第一条和最后一条记录号