我试图显示传感器列表的最新值。该列表还应该可以按时间戳进行排序。
我尝试了两种不同的方法。我将传感器的更新时间包含在主键中:
然后我可以像这样选择列表:
这导致了这个结果:
问题是,我不仅得到了最新的结果,还得到了所有旧值。
如果我从主键中删除更改日期,选择操作就会完全失败。
更新传感器数值也不是一个选项:
这个失败是因为changedate是主键的一部分。
有没有可能只存储每个传感器的最新值,并保持表按时间戳排序?
编辑:与此同时,我尝试了另一种方法,仅存储最新值。
我使用了这个模式:
在插入最新的值之前,我会删除所有旧的值。
但是这种方法失败了,因为
我尝试了两种不同的方法。我将传感器的更新时间包含在主键中:
CREATE TABLE sensors (
customerid int,
sensorid int,
changedate timestamp,
value text,
PRIMARY KEY (customerid, changedate)
) WITH CLUSTERING ORDER BY (changedate DESC);
然后我可以像这样选择列表:
select * from sensors where customerid=0 order by changedate desc;
这导致了这个结果:
customerid | changedate | sensorid | value
------------+--------------------------+----------+-------
0 | 2015-07-10 12:46:53+0000 | 1 | 2
0 | 2015-07-10 12:46:52+0000 | 1 | 1
0 | 2015-07-10 12:46:52+0000 | 0 | 2
0 | 2015-07-10 12:46:26+0000 | 0 | 1
问题是,我不仅得到了最新的结果,还得到了所有旧值。
如果我从主键中删除更改日期,选择操作就会完全失败。
InvalidRequest: code=2200 [Invalid query] message="Order by is currently only supported on the clustered columns of the PRIMARY KEY, got changedate"
更新传感器数值也不是一个选项:
update overview set changedate=unixTimestampOf(now()), value = '5' where customerid=0 and sensorid=0;
InvalidRequest: code=2200 [Invalid query] message="PRIMARY KEY part changedate found in SET part"
这个失败是因为changedate是主键的一部分。
有没有可能只存储每个传感器的最新值,并保持表按时间戳排序?
编辑:与此同时,我尝试了另一种方法,仅存储最新值。
我使用了这个模式:
CREATE TABLE sensors (
customerid int,
sensorid int,
changedate timestamp,
value text,
PRIMARY KEY (customerid, sensorid, changedate)
) WITH CLUSTERING ORDER BY (changedate DESC);
在插入最新的值之前,我会删除所有旧的值。
DELETE FROM sensors WHERE customerid=? and sensorid=?;
但是这种方法失败了,因为
changedate
不是WHERE子句的一部分。