识别事件中的变化

时间:2017-04-19 18:16:47

标签: mysql

mySQL数据库

我需要一些帮助/建议来确定最佳方法和最有效的方法来识别事件中的变化"大数据集中的字段。

我有一些硬件记录温度数据。根据某些设置评估温度数据并进行分类(1,2或3)。我想做的是确定何时更改"事件" / status发生变化,当它变回时,获取此事件的时间戳。

我怀疑最好和最明显的解决方案是模拟Windows 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 个答案:

答案 0 :(得分:0)

我不确定这是否是您想要的结果,但您可以通过这种方式获得类似内容:

Rextester ~ modifies

每次event_code更改时,您都可以模拟LAG函数并设置新组。

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列进行分组,并获取max和min 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 |

现在你可以再次取消它,但请告诉我这个解决方案是否适合你。