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 查询中获取分组记录的第一条和最后一条记录?