MySQL每天定位第一个和最后一个事件

时间:2018-11-25 06:34:22

标签: mysql

我整天在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,是否可以选择一组倒数第二行? 还有其他指针可以让我继续前进吗?

1 个答案:

答案 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
)