如何在 LINQ 中计算累积和?

Posted

技术标签:

【中文标题】如何在 LINQ 中计算累积和?【英文标题】:How to calculate a cummulative sum in LINQ? 【发布时间】:2021-10-24 09:46:45 【问题描述】:

我使用带有实体框架的 C# 开发了我的程序,并使用 LINQ 进行查询。我在将我的 SQL 查询转换为 LINQ 时遇到了问题。

我不知道该怎么办。

这是我在 SQL Server 中的 SQL 查询:

SELECT bs.idBalancesortie, bs.datesortie, bs.c_num_debut,bs.c_num_fin,bs.nombredetickets
    , n.quotite, bs.montant
    , SUM(bs.montant) OVER (ORDER BY bs.idNature ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) as Cumul
    , bs.idNature
FROM BalanceSortie bs
LEFT JOIN Natures n on bs.idNature = n.idNature
order BY bs.idNature

【问题讨论】:

根据问题指南,请展示您尝试过的内容并告诉我们您发现了什么(在本网站或其他地方)以及为什么它不能满足您的需求。并且请不要发布代码、数据、错误消息等的图像 - 将文本复制或输入到问题中。请保留将图像用于图表或演示渲染错误,无法通过文本准确描述的事情。 嗨,所以这是直接的问题,LINQ 与 Sql 或 Sql Server 无关。您使用的是 EF 还是某种 ORM,为什么您认为 linq 会在这里为您提供帮助?您是否有与您的数据相关的 C# 模型...只需多一点解释以及上述所有要点都会有很长的路要走 我正在使用实体框架从模型生成数据库 EF 中的窗口函数未实现。只能通过第三方扩展。 【参考方案1】:

它计算“montant”的累积和,但我希望这个累积和由“idNature”完成

例如

id Category montant  cumul
1   C         49       49
2   A         4        4
3   A         16      20

4

【讨论】:

这似乎不是一个答案。你为什么发布这个? 我相信我的回答让您感到惊讶..您的代码运行良好,但它并没有解决我的问题..我的目标是计算自然“montant”的累积总和。再次感谢您的宝贵帮助! 我真希望人们不要删除 cmets。 你应该改变你原来的帖子,因为那里的cumul只是montant的运行总和。【参考方案2】:

更新了每个 idNature 的累积重置为零

我没有测试过这个解决方案,但获得运行总和的关键是创建“cumul”变量并使用多语句 lambda。这将需要在 Join 之后提前执行(.ToList() 或 AsEnumerable())。

我添加了第二个变量,它保存“当前的 idNature。假设它是一个 int 并且它不能是 -1。

    decimal cumul = 0; // define a variable
    int idNature = -1;
    var target = BalanceSorties
        .Join(idNature, bs => bs.idNature, n => n.idNature, (bs, n) => new  bs, n )
        .OrderBy(q => q.n.idNature)
        .AsEnumerable()
        .Select(q => 
        
            if (idNature != q.n.idNature)
            
               cumul =0;
               idNature = q.n.IdNature;
            
            cumul += q.bs.montant;
            return new
            
                q.bs.idBalancesortie,
                q.bs.datesortie,
                q.bs.c_num_fin,
                q.bs.nombredetickets,
                q.n.quotité,
                Cumul = cumul,
                q.bs.idNature
            ;
        )
    
        .ToList();

【讨论】:

谢谢,我正在测试它 如果有问题请告诉我? 现在试试? 感谢您的帮助,对我帮助很大。

以上是关于如何在 LINQ 中计算累积和?的主要内容,如果未能解决你的问题,请参考以下文章

Anylogic:如何计算累积和?

使用 LINQ 在 C# 中查找数字数组的累积和

如何在python中计算正态累积分布函数的倒数?

如何计算 Postgresql 中特定日期最后 7 行的累积总和?

如何在Python中计算累积正态分布

如何在 Pandas DataFrame 上计算滚动累积乘积