1

我的表有这些字段:

SENSOR_ID INTEGER, 
SENSOR_READING REAL, 
TIME_OF_READING TIMESTAMP, 
HASCHANGED BOOLEAN

每个传感器每天触发 >10,000 个读数。我只想记录 SENSOR_READING 与上次记录的值不同的那些数据点。

或者,只要 SENSOR_READING 与上次记录的值不同,我可以记录所有内容,但将 HASCHANGED 设置为 true。

实现这一目标的最佳语法是什么(使用 PostgreSQL,没有 php 逻辑)?

4

3 回答 3

2

您应该有一个包含传感器及其当前读数的表格,以及UPDATE传感器事件。如果新读数不同,则使用触发器写入日志表。

于 2012-06-11T12:02:32.000 回答
1

我想您必须在放置最后一个值的位置添加一列,然后在每次“读​​取”时,您可以在这两列之间进行比较。

这是一种“纯 sql”方法,但有更好的解决方案,比如回调(你告诉过 php,所以我建议 symfony 和教义可以为你做到这一点,如果你必须做一些步骤,这是一种有效的方法,如果值被改变或类似的东西......)

于 2012-06-11T11:57:41.853 回答
1

你可以做这样的事情

insert into readings (sensor_id, sensor_reading, time_of_reading)
select 42, 1234.5678, current_timestamp
from readings
where not exists (select * 
                  from readings 
                  where sensor_reading = 1234.5678
                    and time_of_reading = (select max(time_of_reading)
                                           from readings
                                           where sensor_id = 42);

这将需要对sensor_reading列进行索引,但我仍然怀疑它实际上会更快。

您不需要存储haschanged属性,因为您可以在检索数据时计算它:

select sensor_id,
       sensor_reading,
       time_of_reading,
       lag(sensor_reading) over (partition by sensor_id order by time_of_reading) = sensor_reading as has_changed
from readings;

这假设它sensor_id实际上并不是唯一的,否则您不能为传感器存储多个读数

它进一步假设您将该REAL列更改为一NUMERIC列,因为REAL使用的值=不准确(实际上存储开始时不准确)

于 2012-06-11T12:04:25.740 回答