Neo4j查询:按时间戳取各列车最新记录计算燃油剩余量平均值
Neo4j查询:按分组取最新记录计算属性平均值
原有查询错误原因
你之前使用的查询逻辑存在绑定错误:直接返回MAX(n.timestamp)做聚合时,没有将m.value与对应最新时间戳的Train节点做关联,返回的燃油值是匹配路径中随机一条历史记录的值,并非对应trainId最新记录的属性值,因此计算结果不符合预期。
正确实现方案
使用如下Cypher查询即可得到正确结果:
MATCH (t:Train)-[:HAS]->(fuel:Attributes {name:'fuelPercentLeft'}) WITH t.trainId AS trainId, head( collect({ timestamp: t.timestamp, fuelValue: toFloat(fuel.value) }) ORDER BY timestamp DESC ) AS latestTrainRecord RETURN avg(latestTrainRecord.fuelValue) AS avgLatestFuelPercent
查询逻辑说明
- 首先匹配所有Train节点,以及通过
HAS关系关联的fuelPercentLeft类型Attributes节点 - 按
trainId分组,将每个分组下的所有记录(包含时间戳、燃油值)收集为列表,按时间戳倒序排序后取列表第一个元素,精准拿到每个列车ID对应的最新入库记录,避免属性和记录错配 - 对所有最新记录的燃油值求平均值,直接返回最终计算结果
- 用
toFloat()转换value字段为数值类型,因为实体类中value定义为String类型,直接聚合计算会触发类型错误
针对你提供的样例数据,上述查询返回结果为41.333333333333336,与预期的41.333结果一致。
内容的提问来源于stack exchange,提问作者Rohit Phutane
相关产品推荐
相关产品推荐

