我的表格包含以下字段:
SENSOR_ID INTEGER,
SENSOR_READING REAL,
TIME_OF_READING TIMESTAMP,
HASCHANGED BOOLEAN
每个传感器每天发射10,000次读数。我只想记录那些SENSOR_READING与上次记录的值不同的数据点。
或者,我可以记录所有内容,但只要SENSOR_READING与上次记录的值不同,就会将HASCHANGED设置为true。
实现该功能的最佳性能是什么(使用PostgreSQL,没有php逻辑)?
答案 0 :(得分:2)
您应该有一个包含传感器及其当前读数的表格,以及传感器事件中的UPDATE
。如果新读数不同,则使用触发器写入日志表。
答案 1 :(得分:1)
我想你必须添加一个放置最后一个值的列,然后在每个“read”中你可以对这两个列进行比较。
这是一种“纯粹的SQL”方法,但有更好的解决方案,比如回调(你讲过php所以我建议symfony和doctrine可以为你做这个,如果你必须做一些步骤,这是一个有效的方法如果值被改变或类似的东西......)
答案 2 :(得分: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
的{{1}}值不准确(实际上存储不准确)开始)