如何实现至少查询100行且完整返回最后一行所属block_no的全部数据
需求可行性结论
这个需求完全具备可行性,属于关系型数据库非常常见的按组批量拉取场景,仅通过标准SQL语句就可以实现,不需要额外的业务层逻辑处理。
实现思路
核心逻辑分两步:
- 按
block_no升序统计每个块包含的行数,以及累计到当前块的总数据量 - 找到满足累计总数据量≥100的最小
block_no作为截止块,返回所有小于等于截止块的完整数据即可
参考实现代码
以下为支持窗口函数的数据库(MySQL 8.0+、PostgreSQL、SQL Server、Oracle等)通用写法:
WITH block_cumulative AS ( SELECT block_no, -- 统计累计到当前block_no的总行数 SUM(COUNT(*)) OVER (ORDER BY block_no ASC) AS total_count FROM assets GROUP BY block_no ), cutoff_block AS ( -- 找到满足行数要求的最小截止块 SELECT MIN(block_no) AS end_block FROM block_cumulative WHERE total_count >= 100 ) -- 拉取截止块之前的所有完整数据 SELECT * FROM assets WHERE block_no <= (SELECT end_block FROM cutoff_block) ORDER BY block_no ASC, id ASC;
边界场景兼容&优化建议
- 即使单个
block_no内的行数超过100,该逻辑也会完整返回该块所有数据,完全符合需求要求 - 如果需要分页拉取后续数据,仅需要在
block_cumulative的查询中增加WHERE block_no > 上一页返回的最大block_no条件即可,适配滚动分页场景 - 给
block_no字段添加索引可以大幅提升该查询的执行效率,数据量百万级也不会有明显性能问题
内容的提问来源于stack exchange,提问作者user16771164
相关产品推荐
相关产品推荐

