如何用C#实现SQL结果集Data列累加并计算offset与Fetch值
C# 实现顺序累加拆分区间方案
数据准备
首先你从SQL查询得到的结果集可按如下形式存储(你可以直接替换为实际的SQL查询返回值):
// 模拟数据集,和你给出的SQL返回结果一致 var queryResults = new List<(int Rownumber, int Data)> { (0,9), (1,0), (2,4), (3,9), (4,15), (5,2), (6,1), (7,6), (8,0), (9,4), (10,1), (11,1), (12,1), (13,1), (14,1), (15,1), (16,1), (17,1), (18,1), (19,1), (20,1), (21,1), (22,1) };
注:如果实际项目中用EF Core、Dapper等框架查询,只需要确保返回集合的每个元素包含
Rownumber和Data两个属性即可,不需要修改核心逻辑。
核心逻辑代码
// 存储所有拆分后的区间结果,也可以每次满足条件时直接使用offset、fetch变量执行业务逻辑 var splitIntervals = new List<(int Offset, int Fetch)>(); if (!queryResults.Any()) { // 结果集为空直接返回,避免空引用异常 return; } int currentSum = 0; int currentStartOffset = queryResults.First().Rownumber; int currentRowCount = 0; foreach (var row in queryResults) { currentSum += row.Data; currentRowCount++; if (currentSum >= 15) { // 累加值满足要求,记录区间 splitIntervals.Add((Offset: currentStartOffset, Fetch: currentRowCount)); // 重置状态,处理下一个区间 currentSum = 0; currentStartOffset = row.Rownumber + 1; currentRowCount = 0; } } // 可选配置:如果最后剩余的行累加不足15也需要作为一个区间,打开下方注释即可 // if (currentRowCount > 0) // { // splitIntervals.Add((Offset: currentStartOffset, Fetch: currentRowCount)); // }
运行结果验证
和你给出的示例预期完全一致:
- 第一组区间:
offset = 0,Fetch = 4 - 第二组区间:
offset = 4,Fetch = 1 - 第三组区间:
offset = 5,Fetch = 7 - 剩余行(行号12到22)累加和为11,不足15,默认不处理,可通过可选配置开启记录。
内容的提问来源于stack exchange,提问作者devram
相关产品推荐
相关产品推荐

