【发布时间】:2015-09-29 05:55:24
【问题描述】:
我正在尝试显示传感器列表中的最新值。该列表还应该可以按时间戳排序。
我尝试了两种不同的方法。我在主键中包含了传感器的更新时间:
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
问题是,我不仅得到最新结果,还得到所有旧值。
如果我从主键中删除 changeate,则选择会一起失败。
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 子句的一部分。
【问题讨论】:
-
这似乎是检索每组问题中最后一条记录的经典问题。 IE。获取每个传感器 ID 的最新读数。
标签: cassandra time-series