我整天在MySQL数据库中记录了一连串的事件,这些事件每5分钟记录一次。我需要确定当天的第一个事件(logid> 0)和最后一个事件(logid = 0),但是努力寻找一个简单的SQL解决方案。
从午夜开始,将在每行的logid字段中存储一个0,直到触发第一个事件为止,此时它将更改为数字>0。然后,将触发各种事件,将数字记录为> 0。在一天的其余时间,此时该字段将再次记录为0,直到午夜,然后该过程重新开始。
是否有一种快速简单的方法来提取标识事件开始时间的行,并显示事件结束时间的另一结果?
CREATE TABLE logs(
id INT AUTO_INCREMENT,
date DATETIME,
logid INT,
PRIMARY KEY (id)
) ENGINE=INNODB;
这是测试数据:
id date logid
1 2018-11-12 01:05:00 0
2 2018-11-12 01:10:00 0
3 2018-11-12 01:15:00 0
4 2018-11-12 01:20:00 0
5 2018-11-12 01:05:00 0
…
84 2018-11-12 06:35:00 0
85 2018-11-12 06:35:00 1
86 2018-11-12 06:40:00 1
87 2018-11-12 06:45:00 1
88 2018-11-12 06:50:00 1
…
164 2018-11-12 15:20:00 1
165 2018-11-12 15:25:00 0
166 2018-11-12 15:30:00 0
167 2018-11-12 15:35:00 0
所需结果集:
85 2018-11-12 06:35:00 1
165 2018-11-12 15:25:00 0
直到第一个实例的logid大于0时,我才关心它。但是我需要确定第一个实例的logid> 0,然后再确定下一个按时间顺序的实例,其中logid = 0。
我的主要尝试是对日期和logid进行分组和排序(编辑:为清楚起见,删除了失败的尝试)
这是我的最新尝试
(SELECT *
FROM logs
WHERE logid>0
GROUP BY date
ORDER BY date
limit 1
)UNION ALL(
SELECT *
FROM logs
WHERE logid>0
GROUP BY date
ORDER BY date DESC
limit 1)
距离越来越近,但还远远不够。这给了我正确的第一行,其中logid = 1,但是给了我最后一行,其中logid = 1(id 164),而不是下一行,其中logid = 0(id = 165)。
如果我将限制1更改为2,是否可以选择一组倒数第二行? 还有其他指针可以让我继续前进吗?
答案 0 :(得分:0)
这个问题似乎对其他人来说不是问题,但我想我会提出我想出的答案,以防将来有人遇到类似情况。
SET @v1 := (SELECT date
FROM logs
WHERE logid > 0
GROUP BY date
ORDER BY date
limit 1);
(SELECT *
FROM logs
WHERE date>@v1 and logid>0
GROUP BY date
ORDER BY date
limit 1
) UNION ALL (
SELECT *
FROM logs
WHERE date>@v1 and logid=0
GROUP BY date
ORDER BY date
limit 1
)