我试图显示传感器列表中的最新值。该列表还应该可以通过时间戳进行排序。通过Cassandra中的时间戳订购最新记录
我尝试了两种不同的方法。我包括传感器的在主键的更新时间:
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
问题是,我没有得到最新的结果,但也得到了所有的旧值。
如果我从主键中删除更改,则select一起失败。
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子句的一部分。
这似乎是经典检索每组问题中的最后一条记录。即获取每个sensorID的最新读数。 – malhal