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 |
答案 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 |
现在你可以再次取消它,但请告诉我这个解决方案是否适合你。