2017-04-19 63 views
0

MySQL数据库识别变化事件

我需要搞清楚查明大型数据集的“事件”字段的变化的最佳方法和最有效的方式一些援助/建议。

我有一些记录温度数据的硬件。温度数据根据一些设置进行评估并进行分类(1,2或3)。我想要做的是确定何时发生“事件”/状态更改以及更改时间,获取此事件的时间戳。

我怀疑最好和最明显的解决方案是模拟窗口LAG功能。令人费解的是,这个事件代码的3选项意味着不同的东西,所以我正在考虑使用事件和滞后(事件)的总和,结果将识别从状态1到状态3的变化。此外,由于数据集很长(数百万行),事件将改变状态将经常改变,我也只需要状态的最后改变(该期间的开始和期间的结束)。也有很多仪表报告,并且在评估状态变化时每个仪表必须保持分开。

如果任何人有任何建议或有类似的查询,以及如何处理,感兴趣。如果能够使查询快速且高效并具有预期的结果,那么即使结构发生变化,也可以接受任何建议。

如数据集

| date_time   | event_code | meter_id | 
|---------------------|------------|----------| 
| 2017-04-15 06:20:10 | 2   |1   | 
| 2017-04-15 06:21:52 | 2   |2   | 
| 2017-04-15 06:28:13 | 1   |2   | 
| 2017-04-15 06:32:01 | 2   |1   | 
| 2017-04-15 06:32:49 | 2   |2   | 
| 2017-04-15 06:37:28 | 3   |1   | 
| 2017-04-15 06:39:21 | 3   |1   | 
| 2017-04-15 06:44:01 | 3   |1   | 
| 2017-04-15 06:45:28 | 2   |1   | 
| 2017-04-15 06:49:18 | 2   |2   | 

所需的结果 - 假设EVENT_CODE 2是正常状态

| date_time   | event_code | meter_id | 
|---------------------|------------|----------| 
| 2017-04-15 06:28:13 | 1   |2   | start and end event 1 meter 2 
| 2017-04-15 06:32:49 | 2   |2   | start event 2 meter 2 
| 2017-04-15 06:37:28 | 3   |1   | start event 3 meter 1 
| 2017-04-15 06:44:01 | 3   |1   | end event 3 meter 1 
| 2017-04-15 06:45:28 | 2   |1   | start and end event 2 meter 1 
| 2017-04-15 06:49:18 | 2   |2   | end event 2 meter 2 

编辑所需的结果

| event_code | meter_id | last_evet_start  | last_evet_end  | 
|------------|----------|---------------------|---------------------| 
| 1   | 2  | 2017-04-15 06:45:28 | 2017-04-15 06:45:28 | 
| 1   | 3  | 2017-04-15 06:37:28 | 2017-04-15 06:44:01 | 
| 2   | 1  | 2017-04-15 06:28:13 | 2017-04-15 06:28:13 | 
| 2   | 2  | 2017-04-15 06:32:49 | 2017-04-15 06:49:18 | 
+1

期望的结果是什么? – McNets

+0

编辑过的问题与期望的输出/结果 – Michael

+0

event_code = 2发生了什么? – McNets

回答

0

我不知道这是否是期望的结果,但你可以通过这种方式得到类似的东西:

Rextester here

您可以模拟LAG功能,并在每次event_code更改时设置一个新组。

select date_time, event_code, 
      if (@last_event = 0 or @last_event <> event_code, @grp := @grp + 1, @grp := @grp) reset_point, 
      @last_event := event_code 
     from (select @last_event := 0, @grp := 0) x, 
      (select date_time, event_code 
      from events 
      where event_code <> 2 
      order by date_time) y; 

| date_time   | event_code | reset_point | @last_event := event_code | 
|---------------------|------------|-------------|---------------------------| 
| 15.04.2017 06:28:13 | 1   | 1   | 1       | 
| 15.04.2017 06:37:28 | 3   | 2   | 3       | 
| 15.04.2017 06:39:21 | 3   | 2   | 3       | 
| 15.04.2017 06:44:01 | 3   | 2   | 3       | 

的,你可以通过新的grp列,并获得最大和最小DATE_TIME组。

select event_code, min(date_time) as start, max(date_time) as end 
from (
     select date_time, event_code, 
      if (@last_event = 0 or @last_event <> event_code, @grp := @grp + 1, @grp := @grp) reset_point, 
      @last_event := event_code 
     from (select @last_event := 0, @grp := 0) x, 
      (select date_time, event_code 
      from events 
      where event_code <> 2 
      order by date_time) y 
    ) z 
group by reset_point 
; 

| event_code | start    | end     | 
|------------|---------------------|---------------------| 
| 1   | 15.04.2017 06:28:13 | 15.04.2017 06:28:13 | 
| 3   | 15.04.2017 06:37:28 | 15.04.2017 06:44:01 | 

现在,您可以再次取消转移,但让我知道这种解决方案是否适合您。

+0

谢谢,可以做到这一点,但包括event_code 2虽然但认为这可能会做 – Michael

+0

我会模拟和在早上运行一些测试数据库 – Michael

+0

要添加evet代码2只需删除wwhere子句。 – McNets