0

我将一些模拟寄存器(0和1)中的值存储到数据库中,我想做以下事情:

我在数据库中有下表用于存储传感器值:

ID   |          TIMESTAMP     |  ALIAS  |  STATUS
 1   |    2012-09-12 12:31:01 |   AR1   |     0
 2   |    2012-09-12 12:31:02 |   AR1   |     0
 3   |    2012-09-12 12:31:03 |   AR1   |     0
 4   |    2012-09-12 12:31:04 |   AR1   |     0
 5   |    2012-09-12 12:31:05 |   AR1   |     0
 6   |    2012-09-12 12:31:06 |   AR1   |     0
 7   |    2012-09-12 12:31:07 |   AR1   |     1
 8   |    2012-09-12 12:31:08 |   AR1   |     1
 9   |    2012-09-12 12:31:09 |   AR1   |     1
10   |    2012-09-12 12:31:10 |   AR1   |     0
11   |    2012-09-12 12:31:11 |   AR1   |     0
12   |    2012-09-12 12:31:12 |   AR1   |     0
13   |    2012-09-12 12:31:13 |   AR1   |     0
14   |    2012-09-12 12:31:14 |   AR1   |     0
15   |    2012-09-12 12:31:15 |   AR1   |     1
16   |    2012-09-12 12:31:16 |   AR1   |     0
17   |    2012-09-12 12:31:17 |   AR1   |     0
18   |    2012-09-12 12:31:01 |   AR1   |     0
 ...

使用 SQL 查询,我希望能够在寄存器更改状态时返回,以便在不使用不必要点的情况下创建图表。请记住,该表包含 100 万个或更多值,通过这样做,我将减少返回数据的大小,并且图表会更快。

我不确定 MySQL 是否提供了所描述的功能,但起初我认为这GROUP BY可能是一个很好的解决方案,但不幸的是它不是。

有什么建议么?

期望的输出:

ID   |          TIMESTAMP     |  ALIAS  |  STATUS
 1   |    2012-09-12 12:31:01 |   AR1   |     0
 6   |    2012-09-12 12:31:06 |   AR1   |     0
 7   |    2012-09-12 12:31:07 |   AR1   |     1
 9   |    2012-09-12 12:31:09 |   AR1   |     1
10   |    2012-09-12 12:31:10 |   AR1   |     0
14   |    2012-09-12 12:31:14 |   AR1   |     0
15   |    2012-09-12 12:31:15 |   AR1   |     1
16   |    2012-09-12 12:31:16 |   AR1   |     0
 ...

您可以观察到我正在删除连续值之间的中间线,因为我只需要第一次和最后一次出现的值以及新值。

有什么建议么?

4

1 回答 1

1

我会用变量来做。不幸的是,我不能把它写出来让你知道,但请在此处查看我的类似回复:

获取mysql中的连续记录

我明天再试试看。

今天的答案:

您可以只使用状态更改的行(而不是包括之前的行)吗?假设记录了所有数据样本,这将为您提供持续时间...

如果是这样,这有效:

set @last_status = null;
select  id, timestamp, alias, status,
  case when @last_status is null or status != @last_status then 1 else  0 end as changed, 
@last_status := status
from sensor_values
having changed = 1;

如果没有,我会在早上的采访之后再做一些修改:)

于 2012-09-13T23:31:04.983 回答