我需要找到具有给定stationid的行,这些行的time1大于指定的time和maximum time2。
表的创建方式如下:
CREATE TABLE forec (
stationid int,
time1 timestamp,
time2 timestamp,
value double,
PRIMARY KEY ((stationid), time1, time2)
) WITH CLUSTERING ORDER BY (time1 DESC)
假设表中的数据如下:
+------------+-----------------------+----------------------+--------+
| stationid | time1 | time2 | value |
+------------+-----------------------+----------------------+--------+
| 1 | 2020-10-21 06:00:00 | 2020-10-21 05:00:00 | 1 |
| 1 | 2020-10-21 06:00:00 | 2020-10-21 04:00:00 | 2 |
| 1 | 2020-10-21 06:00:00 | 2020-10-21 03:00:00 | 3 |
| 1 | 2020-10-21 05:00:00 | 2020-10-21 04:00:00 | 4 |
| 1 | 2020-10-21 05:00:00 | 2020-10-21 03:00:00 | 5 |
| 1 | 2020-10-21 04:00:00 | 2020-10-21 02:00:00 | 6 |
+------------+-----------------------+----------------------+--------+
我想查询:给我stationid=1和time1>=2020-10-21 05:00:00和time2有最大值的所有行。查询应返回以下行:
+------------+-----------------------+----------------------+--------+
| stationid | time1 | time2 | value |
+------------+-----------------------+----------------------+--------+
| 1 | 2020-10-21 06:00:00 | 2020-10-21 05:00:00 | 1 |
| 1 | 2020-10-21 05:00:00 | 2020-10-21 04:00:00 | 4 |
+------------+-----------------------+----------------------+--------+
我知道我可以这样问:
SELECT * FROM forec WHERE stationid = 1 AND time1 >= '2020-10-21 05:00:00';
然后在客户机上过滤结果(并且只保留最长时间为2的行),但是我想知道这是否可以更有效地完成(在cassandra端过滤结果)。
或者我该换个table型号?
2条答案
按热度按时间kwvwclae1#
编辑:根据cassandra文档,“如果在没有聚合函数的情况下选择了一个列,那么在一个带有groupby的语句中,每个组中遇到的第一个值都将被返回。”因此下面的示例仅在
time2
存储在DESC
命令。如果您使用的是最新版本的cassandra(如3.11.x),那么您可以使用
GROUP BY
像这样做然后你得到
注意,这会扫描分区,所以要注意分区大小,特别是在集群列中使用时间戳时。
z31licg02#
使用uda/UDF的解决方案:
状态函数:
最终功能:
聚合函数:
查询: