AWS Timestream是否有等效InfluxDB的last()函数获取列最后非空值
AWS Timestream有完全等效于InfluxDB的last()函数,同时还提供了功能更灵活的max_by()函数可以满足你取完整最新行的需求,两种都比你目前用的order by + limit方案成本低很多。
具体用法
LAST()函数
语法为LAST(待取值的列, 时间列),作用是返回分组内按时间列排序的最后一个非空的待取值列的内容,刚好匹配你需要的取最后一条非空记录的需求。
针对你的场景,仅获取最新的Bewegung值可以直接用如下查询:
SELECT LAST(measure_value::boolean, time) AS "Bewegung" FROM $__database.$__table WHERE measure_name = 'inTrip' AND measure_value::boolean = true AND $__timeFilter
提示:如果不需要筛选值为true的记录,仅需要最后一个非空的记录,去掉WHERE子句中的measure_value::boolean = true条件即可。
- 需同时返回最新值对应的DevEUI、时间戳等完整行信息,可以用
MAX_BY函数,该函数返回指定排序列最大的那一行的内容,写法如下:
SELECT MAX_BY((DevEUI, time, measure_value::boolean), time).* AS (DevEUI, time, "Bewegung") FROM $__database.$__table WHERE measure_name = 'inTrip' AND measure_value::boolean = true AND $__timeFilter
成本优势说明
你目前用的order by time desc limit 1方案需要先扫描整个时间区间内所有符合条件的记录,再排序取第一条,时间区间越大扫描的字节数越多,计费越高。而LAST和MAX_BY都是Timestream内置的优化函数,底层存储是按时间分片存储的,这两个函数会直接定位到最新的符合条件的分片,不需要扫描整个时间区间的历史数据,扫描字节数基本不会随时间区间扩大而增长,能大幅降低查询成本。
如果需要按DevEUI等维度分组获取每个设备的最新状态,只需要加上GROUP BY DevEUI即可:
SELECT DevEUI, LAST(measure_value::boolean, time) AS "Bewegung" FROM $__database.$__table WHERE measure_name = 'inTrip' AND $__timeFilter GROUP BY DevEUI
内容的提问来源于stack exchange,提问作者Ew Na
相关产品推荐
相关产品推荐

