You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 21:15:04