CosmosDB单次查询获取每个指定车牌对应的最新RecordedAt记录
解决方案
完全可以通过单次查询实现该需求。原查询的问题是TOP 1会对所有符合WHERE条件的记录全局排序后仅取第一条,不会按车牌分组取每个分组的最新值。
以下是两种常用实现方案:
方案1:窗口函数(兼容主流新版数据库:SQL Server、MySQL 8.0+、PostgreSQL、Oracle等)
如果需要获取最新记录的所有字段(比如Id、Plate、RecordedAt全量信息),可以用窗口函数实现:
WITH ranked_records AS ( SELECT *, ROW_NUMBER() OVER (PARTITION BY Plate ORDER BY RecordedAt DESC) AS rn FROM 你的实际表名 WHERE Plate IN ('Plate1', 'Plate2', 'Plate3') ) SELECT Plate, RecordedAt FROM ranked_records WHERE rn = 1;
逻辑说明:通过PARTITION BY Plate按车牌分组,每组内部按RecordedAt倒序排序,每组排名为1的就是该车牌对应的最新记录。
方案2:GROUP BY聚合(兼容旧版本MySQL等不支持窗口函数的数据库)
如果仅需要获取车牌和对应的最新时间,不需要同条记录的其他字段,直接用聚合函数加分组的写法更简单高效:
SELECT Plate, MAX(RecordedAt) AS LatestRecordedAt FROM 你的实际表名 WHERE Plate IN ('Plate1', 'Plate2', 'Plate3') GROUP BY Plate;
结果说明
你提供的期望返回结果中Plate1的时间存在笔误,根据示例数据,Plate1对应的最新记录时间为2021/09/26 6:53:06,最终查询返回结果如下:
| Plate | LatestRecordedAt |
|---|---|
| Plate1 | 2021/09/26 6:53:06 |
| Plate2 | 2021/09/26 15:14:02 |
| Plate3 | 2021/09/26 16:02:20 |
如果需要输出你示例中的JSON数组格式,可以在业务代码层对查询结果做格式转换,也可以直接调用数据库自带的JSON生成函数实现,比如SQL Server可以在查询语句末尾加FOR JSON AUTO,MySQL可以用JSON_ARRAYAGG函数生成对应格式。
内容的提问来源于stack exchange,提问作者pedrodotnet
相关产品推荐
相关产品推荐

