如何在Spanner中限制分组数量并实现分组分页查询
解决方案
要实现按EntityId分组返回全量行、支持分组分页和排序,你需要分两步筛选:先获取分页后的目标EntityId集合,再关联原表取出对应所有行。
核心SQL示例
WITH PaginatedEntities AS ( -- 第一步:获取分页&排序后的EntityId列表 SELECT DISTINCT EntityId FROM Objects WHERE EntityType = 0 ORDER BY EntityId DESC -- 按EntityId排序,可改为ASC升序 LIMIT 3 OFFSET 0 -- LIMIT控制分组数量,OFFSET控制分页(OFFSET 0是第1页,OFFSET 3是第2页) ) -- 第二步:关联原表,取出目标EntityId的所有行 SELECT o.* FROM Objects o JOIN PaginatedEntities pe ON o.EntityId = pe.EntityId WHERE o.EntityType = 0 ORDER BY o.EntityId DESC, o.CreatedAt DESC; -- 先按EntityId保证分组顺序,组内可按CreatedAt排序
参数说明
- 分组数量控制:修改
LIMIT的值,比如LIMIT 10就是取10个分组 - 分页实现:修改
OFFSET的值,比如第2页(每页10个分组)就用OFFSET 10 - 排序调整:把
ORDER BY EntityId DESC改成ASC即可切换升序排序;组内排序可调整o.CreatedAt DESC的字段和顺序
效果说明
执行上述SQL后,会先筛选出指定分页范围内的EntityId,再返回这些EntityId对应的所有行,最终结果会按EntityId排序,每个EntityId的所有行连续展示,完全匹配你的需求。
内容的提问来源于stack exchange,提问作者normativepcoder
相关产品推荐
相关产品推荐

