如何编写SQL查询获取基于module去重的最新created集合文档?
筛选集合中按module去重的最新版本文档
我完全get到你的需求了——你需要从集合中提取每个module对应的最新版本文档:按module属性去重,对带有created时间戳的文档,只保留该module下时间最晚的那条;没有created字段的文档则直接保留。
解决方案(以Cosmos DB SQL语法为例)
针对这种分组取最值的场景,我们可以用嵌套查询+分组关联的方式实现:
SELECT * FROM ( -- 内层分组:获取每个module的最新创建时间(若存在) SELECT c.module, MAX(c.created) AS latestCreated FROM c GROUP BY c.module ) groupedDocs -- 关联原集合,匹配目标文档 JOIN originalDoc IN root WHERE originalDoc.module = groupedDocs.module AND (originalDoc.created = groupedDocs.latestCreated OR NOT IS_DEFINED(originalDoc.created))
查询逻辑解释
- 内层子查询:先按
module分组,用MAX(c.created)拿到每个module下的最新创建时间(仅当该module下有文档包含created字段时生效) - 外层关联查询:将分组结果与原集合关联,筛选出符合两个条件的文档:
module与分组结果一致- 要么文档的
created等于该组的最新时间,要么文档本身没有created字段(对应示例中module2、module3这类无时间戳的文档)
针对你的示例数据的返回结果
执行上述查询后,会精准返回你想要的内容:
{"created": "2020-11-22 15:06:07.331503", "module": "module1", "md5": "ee35165603518835bd9cf", "version": "1.0"}
{"module": "module2"}
{"module": "module3"}
如果遇到同一个module下有多个文档created时间完全相同的极端情况,可以额外添加唯一标识(比如md5)的筛选条件来确保只返回一条,不过你的需求场景下上述查询已经足够。
内容的提问来源于stack exchange,提问作者thilemann
相关产品推荐
相关产品推荐

